r - 将列表列中的值分派(dispatch)到单独的列

标签 r list data.table

我有一个带有 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/

相关文章:

r - 根据列号选择值

r - 嵌套最大化与在 R 中使用全局变量的需要并行

RStudio - 更改默认代码块

r - 使用插入符号和data.table创建数据分区

r - 在弹出窗口或 modalDialog 中显示一个 tabPanel

python - 使用sorted(dict.values(), ...)后打印字典

python - 有条件地连接具有条件的字符串列表

list - 即使在使用 isInstanceOf 检查类型后,Scala 类型不匹配错误

r - 我们如何使用 R 中 data.table 组中的最后一行进行一些计算?

r - 如何根据同一列但不同行上的值更新列中的值?