将行添加到数据框

Ril*_*n42 99 r

在R中,一旦数据帧初始化,如何向数据帧添加新行?

到目前为止我有这个:

df<-data.frame("hi","bye")
names(df)<-c("hello","goodbye")
#I am trying to add hola and ciao as a new row
de<-data.frame("hola","ciao")
merge(df,de) #adds to the same row as new columns
#I couldnt find an rbind solution that wouldnt give me an error
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Par*_*ait 104

就像@Khashaa和@Richard Scriven在评论中指出的那样,你必须为你想要追加的所有数据框设置一致的列名.

因此,您需要显式声明第二个数据框的列名de,然后使用rbind().您只需为第一个数据框设置列名df:

df<-data.frame("hi","bye")
names(df)<-c("hello","goodbye")

de<-data.frame("hola","ciao")
names(de)<-c("hello","goodbye")

newdf <- rbind(df, de)
Run Code Online (Sandbox Code Playgroud)

  • 尝试:`newdf <-rbind(df,data.frame(hello ="hola",goodbye ="ciao"))`OR with variable:`newdf <-rbind(df,data.frame(hello = var1,goodbye = VAR2))` (7认同)
  • 谢谢!如果我没有声明第二个数据帧,而是将要添加到新行的每个值存储为变量,您知道如何解决此问题吗? (2认同)

Mat*_*ujo 73

让我们简单一点:

df[nrow(df) + 1,] = c("v1","v2")
Run Code Online (Sandbox Code Playgroud)

根据评论编辑.__CODE__代替__CODE__在添加混合类行的情况下防止类更改.

  • 当尝试添加具有混合数据类型的新行(某些字符串,某些数字)时,这会导致问题.在这种情况下,即使数值也会转换为字符串.一种解决方法是分别添加值,如下所示(假设有3列):`df [nrow(df)+ 1,1:2] = c("v1","v2")`和`df [nrow(df),3] = 100`但仍然是添加新行的好点.所以,+ 1 (7认同)
  • 或使用"list"而不是"c". (7认同)
  • @Matheus Araujo:这是向 df 添加行的最有效方法吗?我有 100k+ 行要添加到循环中。感觉 nrow 会随着行数的增加而变慢。 (2认同)
  • @Arani 已经有了 `list()` 的答案。我恢复了你的编辑。 (2认同)

Yts*_*oer 29

或者,受@MatheusAraujo的启发:

df[nrow(df) + 1,] = list("v1","v2")

这将允许混合数据类型.


小智 12

我喜欢list而不是c因为它更好地处理混合数据类型.在原始海报的问题中添加其他列:

#Create an empty data frame
df <- data.frame(hello=character(), goodbye=character(), volume=double())
de <- list(hello="hi", goodbye="bye", volume=3.0)
df = rbind(df,de, stringsAsFactors=FALSE)
de <- list(hello="hola", goodbye="ciao", volume=13.1)
df = rbind(df,de, stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)

请注意,如果字符串/因子转换很重要,则需要一些额外的控制.

或者使用MatheusAraujo/Ytsen de Boer解决方案的原始变量:

df[nrow(df) + 1,] = list(hello="hallo",goodbye="auf wiedersehen", volume=20.2)
Run Code Online (Sandbox Code Playgroud)

请注意,除非数据框中存在现有数据,否则此解决方案不能很好地处理字符串.


J. *_*in. 10

不是非常优雅,但是:

data.frame(rbind(as.matrix(df), as.matrix(de)))
Run Code Online (Sandbox Code Playgroud)

rbind功能文档:

对于rbind列名称,从第一个参数中获取适当的名称:矩阵的colnames ...

  • 该解决方案无需指定要添加的列,这对于大型数据集上的应用程序来说要好得多 (2认同)

Joe*_*Joe 10

现在有add_row()来自tibbletidyverse包。

library(tidyverse)
df %>% add_row(hello = "hola", goodbye = "ciao")
Run Code Online (Sandbox Code Playgroud)

未指定的列会显示NA