取消列出 data.table 中的嵌套列表列
Unlist nested list columns in data.table
取消列出 data.table 中的嵌套列表列。假设所有列表元素都是同一类型。列表元素已命名,名称也必须处理。
它与 data.table aggregation to list column.
在某种程度上相反
我认为值得在 SO data.table 知识库中拥有它。
下面是我当前的解决方法,我正在寻找更规范的答案。
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
不确定是否更多 "canonical" 但这里有一种修改 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
取消列出 data.table 中的嵌套列表列。假设所有列表元素都是同一类型。列表元素已命名,名称也必须处理。
它与 data.table aggregation to list column.
在某种程度上相反
我认为值得在 SO data.table 知识库中拥有它。
下面是我当前的解决方法,我正在寻找更规范的答案。
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
不确定是否更多 "canonical" 但这里有一种修改 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