如何在data.table中提取相同ID行的唯一值并生成新列
解决方法:提取v1为"b"的所有唯一值并添加为新列
没问题,我来帮你搞定这个需求!咱们可以借助data.table的高效操作来实现,直接在原数据集上添加目标新列,步骤清晰又简洁。
完整实现代码
library(data.table) a1 <- data.table(v1 = "a", v2 = "12,13,12,12,10") a2 <- data.table(v1 = "b", v2 = "10,10,11,12") a3 <- data.table(v1 = "b", v2 = "10,10,13,14,12") DT <- rbindlist(list(a1, a2, a3)) # 生成包含v1="b"所有唯一值的新列 DT[, unique_b_vals := { # 先筛选出v1为b的所有v2字符串,合并成一个完整的逗号分隔串 b_all_vals <- paste(v2[v1 == "b"], collapse = ",") # 拆分字符串为单个元素、去重、再合并回字符串 unique_values <- unique(strsplit(b_all_vals, ",")[[1]]) paste(unique_values, collapse = ",") }] # 查看最终结果 print(DT)
代码说明
- 用data.table的
:=操作符直接在原数据表中添加新列,不需要额外复制数据,效率很高; - 花括号内的代码块可以完成所有中间计算:先提取v1为"b"的所有v2内容,合并成一个大字符串,再拆分去重,最后重新合并成目标格式;
- 如果想更紧凑,也可以写成一行:
DT[, unique_b_vals := paste(unique(unlist(strsplit(v2[v1 == "b"], ","))), collapse = ",")]
运行后你会得到这样的结果:
v1 v2 unique_b_vals 1: a 12,13,12,12,10 10,11,12,13,14 2: b 10,10,11,12 10,11,12,13,14 3: b 10,10,13,14,12 10,11,12,13,14
所有行的unique_b_vals列都会包含v1为"b"的两行中所有的唯一值,完全符合你的需求。
内容的提问来源于stack exchange,提问作者yuskam
相关产品推荐
相关产品推荐

