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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:48:00