You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:45:40