Estou tentando inicializar um data.frame sem nenhuma linha. Basicamente, desejo especificar os tipos de dados para cada coluna e nomeá-los, mas não ter nenhuma linha criada como resultado.
O melhor que pude fazer até agora é algo como:
df <- data.frame(Date=as.Date("01/01/2000", format="%m/%d/%Y"),
File="", User="", stringsAsFactors=FALSE)
df <- df[-1,]
O que cria um data.frame com uma única linha que contém todos os tipos de dados e nomes de colunas que eu queria, mas também cria uma linha inútil que precisa ser removida.
Existe uma maneira melhor de fazer isso?
data.frame
's digitou colunas, então sim, se você quiser inicializar umdata.frame
você deve decidir o tipo das colunas ...data.frame
não é realmente restritivo à "primitividade" dos tipos de colunas (por exemplo, você pode adicionar uma coluna de datas ou mesmo uma coluna contendo a lista de elementos). Além disso, essa pergunta não é uma referência absoluta, pois, por exemplo, se você não especificar o tipo correto da coluna, não bloqueará a adição de linhas adicionais com colunas de tipos diferentes ... portanto, adicionarei uma nota, mas não um exemplo com todos os tipos primitivos porque não cobrir todas as possibilidades ...data.frame(Doubles=rep(as.double(NA),numberOfRow), Ints=rep(as.integer(NA),numberOfRow))
Se você já possui um quadro de dados existente , digamos
df
que possui as colunas desejadas, basta criar um quadro de dados vazio removendo todas as linhas:Observe que
df
ainda contém os dados, masempty_df
não.Eu encontrei esta pergunta procurando como criar uma nova instância com linhas vazias, então acho que pode ser útil para algumas pessoas.
fonte
df[NA,]
isso, também afetará o índice (o que é improvável que seja o que você deseja), eu usariadf[TRUE,] = NA
; no entanto, observe que isso substituirá o original. Você precisará copiar o trama de dados de primeirocopy_df = data.frame(df)
e depoiscopy_df[TRUE,] = NA
empty_df
withempty_df[0:nrow(df),] <- NA
.Você pode fazer isso sem especificar os tipos de coluna
fonte
Você pode usar
read.table
com uma sequência vazia para a entrada datext
seguinte maneira:Como alternativa, especificando o
col.names
como uma sequência:Agradecimentos a Richard Scriven pela melhoria
fonte
read.table(text = "", ...)
assim, você não precisa abrir explicitamente uma conexão.read.csv
abordagem também trabalha comreadr::read_csv
, como emread_csv("Date,File,User\n", col_types = "Dcc")
. Dessa forma, você pode criar diretamente um prato vazio da estrutura necessária.A maneira mais eficiente de fazer isso é usar
structure
para criar uma lista que tenha a classe"data.frame"
:Para colocar isso em perspectiva em comparação com a resposta atualmente aceita, aqui está uma referência simples:
fonte
data.table
geralmente contém um.internal.selfref
atributo que não pode ser falsificado sem chamar asdata.table
funções. Tem certeza de que não está confiando em um comportamento não documentado aqui?data.table
e presumi que o Google encontrou o que eu queria e tudo aqui estádata.table
relacionado.data.frame()
fornece verificações de nomes, nomes de nomes de domínio, etc.Apenas declare
quando você tenta
rbind
a primeira linha, ela cria as colunasfonte
rbind
isso funcionaria bem, se não ...rbind()
.Se você está procurando falta:
portanto, você não precisa especificar os nomes das colunas separadamente. Você obtém o tipo de coluna padrão lógico até preencher o quadro de dados.
fonte
Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 2
Criei um quadro de dados vazio usando o código a seguir
e tentou vincular algumas linhas para preencher o mesmo da seguinte maneira.
mas começou a fornecer nomes de colunas incorretos da seguinte maneira
A solução para isso é converter newrow no tipo df da seguinte maneira
agora fornece o quadro de dados correto quando exibido com nomes de colunas da seguinte maneira
fonte
Para criar um quadro de dados vazio , transmita o número de linhas e colunas necessárias para a seguinte função:
Para criar um quadro vazio ao especificar a classe de cada coluna , basta passar um vetor dos tipos de dados desejados para a seguinte função:
Use da seguinte maneira:
Que dá:
Para confirmar suas escolhas, execute o seguinte:
fonte
Se você deseja criar um data.frame vazio com nomes dinâmicos (nomes de colunas em uma variável), isso pode ajudar:
Você também pode alterar os tipos, se precisar. gostar:
fonte
Se você não se importa em não especificar tipos de dados explicitamente, pode fazê-lo desta maneira:
fonte
Ao usar
data.table
, podemos especificar tipos de dados para cada coluna.fonte
Se você deseja declarar esse tipo
data.frame
com muitas colunas, provavelmente será difícil digitar todas as classes de colunas manualmente. Especialmente se você puder usarrep
, essa abordagem é fácil e rápida (cerca de 15% mais rápida que a outra solução que pode ser generalizada assim):Se as classes de coluna desejadas estiverem em um vetor
colClasses
, você poderá fazer o seguinte:lapply
resultará em uma lista do comprimento desejado, cada elemento do qual é simplesmente um vetor digitado vazio comonumeric()
ouinteger()
.setDF
converte issolist
por referência a adata.frame
.setnames
adiciona os nomes desejados por referência.Comparação de velocidade:
Também é mais rápido do que usar de
structure
maneira semelhante:fonte
Digamos que os nomes das colunas sejam dinâmicos, você pode criar uma matriz com nome de linha vazia e transformá-la em um quadro de dados.
fonte
Esta pergunta não abordou especificamente minhas preocupações (descritas aqui ), mas caso alguém queira fazer isso com um número parametrizado de colunas e sem coerção:
Como o divibisan afirma sobre a questão vinculada,
fonte
Se você já possui um dataframe, pode extrair os metadados (nomes e tipos de colunas) de um dataframe (por exemplo, se estiver controlando um BUG que é acionado apenas com determinadas entradas e precisa de um Dataframe fictício vazio):
E, em seguida, use o
read.table
para criar o quadro de dados vaziofonte