如何在R中将6列数据转换为2列(保留重复项不汇总)
解决R中数据集宽转长的问题
我来帮你搞定这个数据重塑的需求!首先先把你的原始数据集整理成更标准的R代码形式,方便后续操作:
Sample.Score <- data.frame( V1 = c("A", "E", "E", "H"), V2 = c("B", "F", "H", "C"), V3 = c("C", "G", "B", "F"), V4 = c(45, 12, 23, 23), V5 = c(78, 42, 85, 12), V6 = c(39, 93, 35, 64) )
你的核心需求是把这个宽格式数据集,转换成仅包含项目名称和对应得分的两列长格式,并且不需要提前合并重复项目的得分。下面给你两种实用的解决方案:
方法1:用tidyverse的pivot_longer(推荐,代码更直观)
如果你已经安装了tidyverse包,直接用这段代码就能快速实现:
library(tidyverse) Sample.Score2 <- Sample.Score %>% pivot_longer( cols = everything(), names_to = c(".value", "group"), names_pattern = "(V)(\\d)" ) %>% select(-group) # 去掉不需要的分组辅助列
运行后得到的结果完全符合你的要求:
> Sample.Score2 # A tibble: 12 × 2 V1 V2 <chr> <dbl> 1 A 45 2 B 78 3 C 39 4 E 12 5 F 42 6 G 93 7 E 23 8 H 85 9 B 35 10 H 23 11 C 12 12 F 64
方法2:用base R原生的reshape函数
如果不想加载额外包,也可以用R自带的函数实现:
Sample.Score2 <- reshape( Sample.Score, direction = "long", varying = list(c("V1", "V2", "V3"), c("V4", "V5", "V6")), v.names = c("V1", "V2"), idvar = "id", times = 1:3 ) %>% select(-id, -time) # 清理辅助列
这个方法同样能得到和上面一致的结果,只是代码可读性稍弱一点。
关键说明
两种方法都是把原数据每行的3组「项目+得分」拆成3行,完整保留所有原始数据,没有对重复项目的得分做合并处理,完全匹配你的需求。其中pivot_longer的names_pattern是核心逻辑:它把V1/V4这类列名拆分成前缀和数字,自动把同数字组的项目名称和得分对应起来。
内容的提问来源于stack exchange,提问作者Saftever
相关产品推荐
相关产品推荐

