2016-12-05 47 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) 
相关问题