【问题标题】:Unlist nested list columns in data.table取消列出 data.table 中的嵌套列表列
【发布时间】:2015-07-15 12:09:15
【问题描述】:

未列出 data.table 中的嵌套列表列。假设所有列表元素都是相同的类型。列表元素已命名,名称也必须处理。
它在某种程度上与data.table aggregation to list column 的操作相反。
我认为值得将它放在 SO 知识库中。
我目前的解决方法如下,我正在寻找更规范的答案。

library(data.table)
dt <- data.table(
    a = letters[1:3], 
    l = list(list(c1=6L, c2=4L), list(x=2L, y=4L, z=3L), list())
)
dt[]
#    a      l
# 1: a <list>
# 2: b <list>
# 3: c <list>
dt[,.(a = rep(a,length(l)),
      nm = names(unlist(l)),
      ul = unlist(l)),
   .(id = seq_along(a))
   ][, id := NULL
     ][]
#    a nm ul
# 1: a c1  6
# 2: a c2  4
# 3: b  x  2
# 4: b  y  4
# 5: b  z  3
# 6: c NA NA

【问题讨论】:

  • 你就不能dt[, .(nm = names(unlist(l)), ul = unlist(l)), by = a]吗?
  • 最后一行,有一个空列表,不是这样处理的。
  • @jangorecki,空列表也总是未命名吗?
  • 如果您的空列表位于开头,则此解决方法将不起作用,因为data.table 将无法确定结果的列类型。
  • @Frank 与tables() 函数所做的差不多,但我想收集更多元数据。例如。列类型:data.table(name = "dt", coltypes = list(list(col1="integer", col2="character")))。 @Simon 好点。

标签: data.table r data.table


【解决方案1】:

不确定它是否更“规范”,但这里有一种修改l 的方法,因此您可以使用by=a,考虑到您知道列表中数据的类型(有一些改进,感谢@DavidArenburg):

dt[lengths(l) == 0, l := NA_integer_][, .(nm = names(unlist(l)), ul = unlist(l)), by = a]

#   a nm ul
#1: a c1  6
#2: a c2  4
#3: b  x  2
#4: b  y  4
#5: b  z  3
#6: c NA NA

【讨论】:

    猜你喜欢
    • 2021-03-20
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2016-12-16
    • 2018-09-28
    • 2021-07-11
    相关资源
    最近更新 更多