2016-09-15 58 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 –