2016-09-15 59 views
2

我在R中有一个data.table,我正在使用data.tables来计算基于行值的列表。目前我已尝试以下代码为例在data.table中返回列中的列表

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) 

如何去与此?

+0

什么是你想要的输出?从你的问题中不清楚你想完成什么。你能展示一个预期的样本结果吗? –

+0

期望的输出在问题中被提及为预期的输出 – theArun

+0

您的意思是'dt [,seq2:= list(list(replicate(5,num))),by = 1:nrow(dt)]'?据我所知,'by = .I'无声无息。 – Frank

回答

2

感谢@Frank和@大卫,答案是

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

主要是通过引起.I =静静地什么也不做。

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

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

在不同的方向,如果你正在寻找使用dplyr

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

尽管看起来像'replicate'没有向量化,所以你不会在两个IMO之间有太大的区别 –

+0

即使在100,000行的情况下? – theArun

+0

实际上它只是没有通过'n'向量化,所以这应该是更快的IMO。这是很容易的基准btw –