首页 > 解决方案 > 我可以在 data.table 中使用字符串拆分和 dcast 吗?

问题描述

拆分字符串,构建具有唯一值的列,并根据字符串填充值。

样本数据表:

library(data.table)
(dt <- data.table(id = as.numeric(1:5),
                 x = c(NA, "ab.cde", "co.hij.ab", "cox.cde.kl", NA)))

dcast 方法:接近但不完全

dcast(dt, id ~ x, value.var = "id")
dt[dcast(dt, id ~ x, value.var = "id"), on=.(id = id)]

dcast 构建了一些列并填充了一些值,但它没有做我想要的。

字符串拆分方法:我无法转置

dt[, unique(unlist(strsplit(dt$x, ".", fixed = TRUE))) :=
tstrsplit(dt$x, ".", fixed = TRUE)]

消息说我的 LHS 有 7 列,而我的 RHS 只有 3。所以转置不起作用。也许我可以构建列并稍后填充值:

dt[, unique(unlist(strsplit(dt$x, ".", fixed = TRUE))) := character()]

现在我越来越近了,但还没有。我需要根据 dt$x 上的匹配(或其他内容)用 1 和 0 填充这些列;

标签: r

解决方案


我们可以使用data.table方法,即dcast

library(data.table)
dcast(dt[, {x1 <- strsplit(x, "\\."); c(list(unlist(x1)), 
      .SD[rep(seq_len(.N), lengths(x1))])}], id + x ~ V1, length)
#    id          x NA ab cde co cox hij kl
#1:  1       <NA>  1  0   0  0   0   0  0
#2:  2     ab.cde  0  1   1  0   0   0  0
#3:  3  co.hij.ab  0  1   0  1   0   1  0
#4:  4 cox.cde.kl  0  0   1  0   1   0  1
#5:  5       <NA>  1  0   0  0   0   0  0

推荐阅读