如何在R语言中实现含多值字段的数据集行列转换?
R语言实现data.table行列转换的快速方法
首先看原始数据集的创建代码:
library(data.table) dat1 <- data.table(id = c(1, 2, 34, 99), class = c("sports", "", "music, sports", ""), hobby = c("knitting, music, sports", "", "", "music"))
原始数据结构如下:
id class hobby 1 1 sports knitting, music, sports 2 2 3 34 music, sports 4 99 music
我们需要将其转换为每行对应唯一input值,class和hobby列存储对应的id(多值用逗号分隔)的结构,以下是基于data.table的高效实现步骤:
实现代码
# 1. 将宽表转长表,同时拆分逗号分隔的多值列 long_dat <- melt(dat1, id.vars = "id", measure.vars = c("class", "hobby"), variable.name = "type")[, strsplit(value, ",\\s*"), by = .(id, type) ][, .(input = V1, id = id, type = type)] # 2. 过滤掉空的input行 long_dat <- long_dat[input != ""] # 3. 按input和type分组,合并对应的id为逗号分隔的字符串 agg_dat <- long_dat[, .(ids = paste(sort(id), collapse = ", ")), by = .(input, type)] # 4. 将长表转回宽表,缺失值填充为空字符串 result <- dcast(agg_dat, input ~ type, value.var = "ids", fill = "") # 查看最终结果 print(result)
代码说明
melt函数把原始宽表转换为长格式,区分class和hobby两种类型;strsplit(value, ",\\s*")拆分每个单元格中逗号(含可选空格)分隔的多值,生成每行对应单个input的记录;- 过滤空input行,避免无效数据干扰;
- 分组后用
paste(sort(id), collapse = ", ")把同一input同一类型下的id排序并合并成字符串; dcast转换回宽格式,fill = ""确保没有对应id的单元格显示为空字符串。
运行后得到的结果如下:
input class hobby 1 knitting 1 2 music 34 1, 99 3 sports 1, 34 1
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

