r - 我可以在 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 填充这些列;
- id 1 应该有一个 1 on column: NA
- id 2 的列应为 1:ab 和 cde
- id 3 的列应为 1:co、hij 和 ab
- id 4 的列应为 1:cox、cde 和 kl
- id 5 应该有一个 1 列:NA
解决方案
我们可以使用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
推荐阅读
- java - 尝试签署 ANDROID 应用程序时出现异常 - “java.lang.SecurityException:Manifest 主要属性的签名文件摘要无效”
- python-3.x - 如何使用椭圆曲线创建 PKey?
- c - 我在 C 中对这个可变参数宏做错了什么?
- laravel - 尝试将 vue paystack 添加到我的 vue 项目中
- php - 按帖子浏览次数排序不起作用。插件:“发布视图计数器” - Wordpress
- python - 将 torchscript 模型转换为 Core ML
- python - 如何将 gurobi 更改为 pyomo 求解器
- string - 属性需要从字符串变为实数
- python-3.x - 无法在 Python 中比较相同但重新声明的命名元组的类型
- ios - Flutter - 在 WKWebView 中阻止 Webview Cookie