在data.table中插入一行

Tah*_*sha 44 r data.table

如果我有一个数据框

set.seed(12345) 
df=data.frame(a=rnorm(5),b=rnorm(5))
Run Code Online (Sandbox Code Playgroud)

我可以通过例如添加一行

df[6,] =c(5,6)

如果我现在在data.table中做等效的

library(data.table)
dt=data.table(df)
dt[6,]=c(5,6)
Run Code Online (Sandbox Code Playgroud)

它失败并出现错误.将行插入data.table的正确方法是什么?

dar*_*sco 46

要扩展@Franks答案,如果在您的特定情况下,您要追加一行,那就是:

set.seed(12345) 
dt1 <- data.table(a=rnorm(5), b=rnorm(5))
Run Code Online (Sandbox Code Playgroud)

以下是等同的; 我发现第一个更容易阅读,但第二个更快:

microbenchmark(
  rbind(dt1, list(5, 6)),
  rbindlist(list(dt1, list(5, 6)))        
  )
Run Code Online (Sandbox Code Playgroud)

我们可以看到:

                             expr     min      lq  median       uq     max
           rbind(dt1, list(5, 6)) 160.516 166.058 175.089 185.1470 457.735
 rbindlist(list(dt1, list(5, 6))) 130.137 134.037 140.605 149.6365 184.326
Run Code Online (Sandbox Code Playgroud)

如果你想在其他地方插入行,以下内容将起作用,但它并不漂亮:

rbindlist(list(dt1[1:3, ], list(5, 6), dt1[4:5, ]))
Run Code Online (Sandbox Code Playgroud)

甚至

rbindlist(list(dt1[1:3, ], as.list(c(5, 6)), dt1[4:5, ]))
Run Code Online (Sandbox Code Playgroud)

赠送:

            a          b
1:  0.5855288 -1.8179560
2:  0.7094660  0.6300986
3: -0.1093033 -0.2761841
4:  5.0000000  6.0000000
5: -0.4534972 -0.2841597
6:  0.6058875 -0.9193220
Run Code Online (Sandbox Code Playgroud)

如果要修改一行(这是首选方法),则需要提前定义data.table的大小,即

dt1 <- data.table(a=rnorm(6), b=rnorm(6))
set(dt1, i=6L, j="a", value=5) # refer to column by name
set(dt1, i=6L, j=2L, value=6) # refer to column by number
Run Code Online (Sandbox Code Playgroud)

谢谢@Boxuan,我修改了这个答案,考虑到你的建议,这个建议更快,更容易阅读.