2016-12-05 42 views
0

名單,我有以下數據表:更簡單的方法來創建數據表中的R

dt <- data.table(x = c("Allen", "Brandon", "Allen", "Brandon", "Chris", "Chris"), 
       y = c("orange", "red", "blue", "gold", "black", "white")) 

print(dt) 
#  x  y 
#1 Allen orange 
#2 Brandon red 
#3 Allen blue 
#4 Brandon gold 
#5 Chris black 
#6 Chris white 

而且我想它移植到使用dt$x的名單符列表格式:

print(dt2) 
[[1]] 
[1] "orange" "blue" 

[[2]] 
[1] "red" "gold" 

[[3]] 
[1] "black" "white" 

我目前正在做這件事的方式是使用下面的函數,但我正在尋找一個更有效的解決方案來創建列表,因爲我的真實數據集包含100k行。

dt.f <- function(a) { 
    j <- dt[x == a, ] 
    j2 <- as.vector(j$y) 
} 

dt2 <- do.call("list", lapply(unique(dt$x), function(a) dt.f(a))) 
+0

你可以交替地做'dt [,。(ys =。(y)),by = x]'(一個不同的形式在)。 – Frank

+1

@Frank,當然'dt [,。(ys =。(y)),by = x] [,ys]'給出了OP想要的內容。甚至更簡單的'dt [,。(。(y)),x] [,V1]' – dww

+0

@dww謝謝,是的。我想這可能不如'unname(with(dt,split(y,x)))'更有效,如果這是OP真正堅持的輸出,這看起來更直接。 – Frank

回答

1

使用split功能:

dt2 <- split(dt, dt$x) 

你可以操縱d2然後只提取列表(與y),如果這就是你想要的第二部分。

+0

'split(dt2 [,y],dt2 [,x])'也許? – thelatemail

1

我會用split.data.table(可從1.9.8+):

split(dt, by="x", keep.by=FALSE) 

,如果你想獲得向量,而不是單個列data.table你可以包裝成lapply(., unlist)

lapply(split(dt, by="x", keep.by=FALSE), unlist, use.names=FALSE) 
相關問題