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

在R语言中对多组列执行Unpivot(逆透视)操作

在R中实现分组逆透视(Unpivot)操作

先确认输入数据:

userid=c(1,2,3)
GroupA_measure1=c(65,96,12)
GroupA_measure2=c(70,89,14)
GroupB_measure1=c(45,12,38)
GroupB_measure2=c(50,8,40)

Input=data.frame(userid,GroupA_measure1,GroupA_measure2,GroupB_measure1,GroupB_measure2)

下面提供两种常用实现方法:

方法一:用tidyverse工具链(pivot_longer + pivot_wider)

tidyverse语法直观,适合常规数据处理场景:

library(tidyverse)

output_tidy <- Input %>%
  # 将所有Group开头的列转成长格式,拆分列名为group和measure
  pivot_longer(cols = starts_with("Group"), 
               names_to = c("group", "measure"), 
               names_sep = "_measure") %>%
  # 将group列转为宽格式的列
  pivot_wider(names_from = group, values_from = value) %>%
  # 把measure转为整数类型,匹配期望输出
  mutate(measure = as.integer(measure)) %>%
  # 按userid和measure排序
  arrange(userid, measure)

# 查看结果
output_tidy

方法二:用data.table包(melt + dcast)

data.table运算效率更高,适合处理大体积数据集:

library(data.table)

# 将输入数据转为data.table格式
setDT(Input)

# 第一步:转成长格式
melted_data <- melt(Input, id.vars = "userid", 
                    variable.name = "group_measure", 
                    value.name = "value")

# 拆分group_measure列,得到group和measure字段
melted_data[, c("group", "measure") := tstrsplit(group_measure, "_measure")]

# 第二步:转成目标宽格式
output_dt <- dcast(melted_data, userid + measure ~ group, value.var = "value")

# 调整measure为整数类型
output_dt[, measure := as.integer(measure)]

# 查看结果
output_dt

两种方法最终都会生成你需要的输出结构。

内容的提问来源于stack exchange,提问作者ParthaSarathi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 03:35:13