我有以下数据表:
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 :(得分:1)
使用split
功能:
dt2 <- split(dt, dt$x)
您可以操纵d2
然后只提取列表的第二部分(y
),如果您想要的话。
答案 1 :(得分:1)
我会使用split.data.table
(可从1.9.8 +获得):
split(dt, by="x", keep.by=FALSE)
如果你想获得vector而不是单列data.table,你可以将其包含到lapply(., unlist)
中:
lapply(split(dt, by="x", keep.by=FALSE), unlist, use.names=FALSE)