【问题标题】:Insert a row in a data.table在 data.table 中插入一行
【发布时间】:2013-05-15 04:32:06
【问题描述】:

如果我有一个数据框

set.seed(12345) 
df=data.frame(a=rnorm(5),b=rnorm(5))

我可以通过例如添加一行

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

如果我现在在 data.table 中做同样的事情

library(data.table)
dt=data.table(df)
dt[6,]=c(5,6)

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

【问题讨论】:

  • 我认为这个包计划了一个insert()函数,以使其添加行相对较快,但到目前为止,您必须预先分配数据表的nrow。也许是这样:r-forge.r-project.org/tracker/…
  • rbind(dt,list(5,6)) 足以满足您的需要吗?
  • 顺便说一句,每次我认为我需要逐行添加数据时,我在想 C 风格而不是 R 风格 - 所以除了上述 cmets 你应该重新考虑你是否真的需要这样做
  • 我认为这几乎是同一个问题......? stackoverflow.com/questions/16792001/…
  • @Roland:使用data.table的大部分原因是内存效率,由于不复制表。 Rbind 确实创建副本,并且可以成为大数据的巨大内存猪...

标签: r data.table


【解决方案1】:

为了扩展@Franks 的答案,如果在您的特定情况下您要附加一行,它是:

set.seed(12345) 
dt1 <- data.table(a=rnorm(5), b=rnorm(5))

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

microbenchmark(
  rbind(dt1, list(5, 6)),
  rbindlist(list(dt1, list(5, 6)))        
  )

如我们所见:

                             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

如果你想在别处插入该行,下面的方法会起作用,但它并不漂亮:

rbindlist(list(dt1[1:3, ], list(5, 6), dt1[4:5, ]))

甚至

rbindlist(list(dt1[1:3, ], as.list(c(5, 6)), dt1[4:5, ]))

给予:

            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

如果您正在就地修改行(这是首选方法),则需要提前定义 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

感谢@Boxuan,我已经修改了这个答案以考虑你的建议,它更快更容易阅读。

【讨论】:

  • 为什么不使用 rbindlist(list(dt1, list(5,6))) 作为您的第二个选项以获得更好的可读性?
  • @Boxuan rbindlist(list(dt1, list(c(5, 6)))) 给了我Error ... Item 2 has 1 columns, inconsistent with item 1 which has 2 columns... 查看list(c(5, 6)) 的输出,这是一个包含一个元素的列表,而as.list(c(5, 6)) 是两个元素。
  • 这很奇怪。我可以在我的机器上运行它。也许我们有不同的版本? packageVersion("data.table") 给我[1] '1.9.4'getRversion() 给我[1] '3.2.0'
  • 也许这是罪魁祸首:我建议list(5,6) 而不是list(c(5, 6))。 =)
  • 是的;对不起,我第一次错过了。我同意你乐于助人的 cmets。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2016-09-12
相关资源
最近更新 更多