【问题标题】:return a list in a column in data.table在 data.table 的列中返回一个列表
【发布时间】:2016-09-15 11:41:25
【问题描述】:

我在 R 中有一个 data.table,我希望使用 data.tables 根据行值计算一个列表。我目前已经尝试过以下代码作为示例

library("data.table")
 dt <- data.table (data.frame(name = c("A","B","C")), num = c(10,20,30))
dt [,seq := list(replicate(5,num)),by = .I]

但是,它不会生成列表,而是将num 列中的值重复到seq 列。如下图

name     num    seq
A         10     10
B         20     20
C         30     30

预期的输出是

name     num    seq
A         10     list(10, 10, 10, 10, 10)
B         20     list(20, 20, 20, 20, 20)
C         30     list(30, 30, 30, 30, 30)

我该怎么做?

【问题讨论】:

  • 你想要的输出是什么?从您的问题中不清楚您要完成什么。你能展示一个预期结果的样本吗?
  • 问题中提到了所需的输出作为预期输出
  • 你的意思是dt [,seq2 := list(list(replicate(5,num))), by = 1:nrow(dt)]?据我所知,by=.I 默默无闻。
  • 我会选择dt[, res := transpose(replicate(5, num, simplify = FALSE))],而不是按行操作
  • 在 R 中,你做的每件事都是按行做的——好吧,别做

标签: r data.table


【解决方案1】:

感谢@Frank 和@David,答案是

dt [,seq2 := list(list(replicate(5,num))), by = 1:nrow(dt)]

主要是因为 = 。我默默地什么都不做。

或者,您可以执行以下操作,因为最好不要执行逐行操作。

dt[, res := transpose(replicate(5, num, simplify = FALSE))]

换个方向,如果你想使用 dplyr

dt %>% rowwise() %>% mutate(seq = list(rep(num, 5)))

【讨论】:

  • 虽然replicate 似乎没有矢量化,所以这两个 IMO 之间不会有太大区别
  • 即使在 100,000 行的情况下?
  • 实际上它只是没有在n 上进行矢量化,所以这应该是更快的 IMO。顺便说一句,基准测试很容易
  • 另一种选择:dt[, .(lapply(num, `[`, rep(1,5))) ]
  • @alistaire 我讨厌它。
猜你喜欢
  • 2021-04-19
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
相关资源
最近更新 更多