在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
相关产品推荐
相关产品推荐

