【问题标题】:Easier way to create a list from data table in R从 R 中的数据表创建列表的更简单方法
【发布时间】:2016-12-05 22:35:43
【问题描述】:

我有如下数据表:

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)))

【问题讨论】:

  • 您可以交替使用dt[, .(ys = .(y)), by=x](另一种格式)。
  • @Frank 当然还有dt[, .(ys = .(y)), by=x][,ys] 给出了 OP 想要的。或者更简单的dt[, .(.(y)), x][,V1]
  • @dww 谢谢,是的。我想这可能比unname(with(dt, split(y,x))) 效率低,这似乎更直接,如果这是 OP 真正坚持的输出。

标签: r list data.table


【解决方案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)

【讨论】:

    【解决方案2】:

    使用split函数:

    dt2 <- split(dt, dt$x)
    

    您可以操作d2,然后只提取列表的第二部分(y),如果这就是您想要的。

    【讨论】:

    • split(dt2[,y], dt2[,x]) 也许?
    猜你喜欢
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 2018-07-14
    • 2023-04-09
    • 1970-01-01
    • 2021-03-21
    • 2022-11-23
    • 2021-08-03
    相关资源
    最近更新 更多