我有一个带有 list
的 data.table “c”栏:
df <- data.table(a = 1:3, c = list(1L, 1:2, 1:3))
df
a c
1: 1 1
2: 2 1,2
3: 3 1,2,3
我想为“c”中的值创建单独的列。
我创建了一组新列 F_1、F_2、F_3:
mmax <- max(df$a)
flux <- paste("F", 1:mmax, sep = "_")
df[, (flux) := 0]
df
a c F_1 F_2 F_3
1: 1 1 0 0 0
2: 2 1,2 0 0 0
3: 3 1,2,3 0 0 0
我想将“c”中的值分派(dispatch)到 F_1、F_2、F_3 列,如下所示:
df
a c F_1 F_2 F_3
1: 1 1 1 0 0
2: 2 1,2 1 2 0
3: 3 1,2,3 1 2 3
我试过的:
comp_vect <- function(vec, mmax){
vec <- vec %>% unlist()
n <- length(vec)
answr <- c(vec, rep(0, l = mmax -n))
}
df[ , ..flux := mapply(comp_vect, c, mmax)]
预期的 data.table 是:
> df
a c F_1 F_2 F_3
1: 1 1 1 0 0
2: 2 1,2 1 2 0
3: 3 1,2,3 1 2 3
最佳答案
我采用了完全不同的方法。我 rbind
编辑列表列,然后 dcast
编辑它,获得所需的结果。最后一部分是设置名称。
library(data.table)
df <- data.table(a = 1:3, d = list(1L, c(1L, 2L), c(1L, 2L, 3L)))
df2 <- df[, rbind(d), by = a][, dcast(.SD, a ~ V1, fill = 0)]
setnames(df2, 2:4, flux)[]
a F_1 F_2 F_3
1: 1 1 0 0
2: 2 1 2 0
3: 3 1 2 3
在哪里
flux
是您在问题中定义的名称变量。请注意避免使用列名
c
,因为它可能与函数 c()
混淆.
关于r - 将列表列中的值分派(dispatch)到单独的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58630447/