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

R语言透视表格:能否手动指定列而非使用names_pattern?

手动指定列实现透视的可行方法

首先看原始数据和目标效果:
原始数据定义:

df<-data.frame(GROUP = c("A", "B", "C"),
               CLASS_1_1 = c(20, 60, 82),
               CLASS_2_1 = c(37, 22, 8),
               CLASS_1_2 = c(15,100,76),
               CLASS_2_2 = c(84, 18,88))

原代码通过正则匹配得到的目标结果是:

# A tibble: 6 × 3
  GROUP CLASS_1 CLASS_2 Date 
  <chr>   <dbl>   <dbl> <chr>
1 A          20      37 1    
2 A          15      84 2    
3 B          60      22 1    
4 B         100      18 2    
5 C          82       8 1    
6 C          76      88 2    

以下是两种无需依赖列名正则的手动实现方式:

方法1:自定义列映射+两次透视

先定义列与目标分类的对应关系,再通过两次透视转换格式:

library(tidyr)
library(dplyr)

# 手动定义每列对应的CLASS和Date分类
col_mapping <- tibble(
  col_name = c("CLASS_1_1", "CLASS_2_1", "CLASS_1_2", "CLASS_2_2"),
  CLASS = c("CLASS_1", "CLASS_2", "CLASS_1", "CLASS_2"),
  Date = c("1", "1", "2", "2")
)

# 执行转换
df %>%
  pivot_longer(-GROUP, names_to = "col_name", values_to = "value") %>%
  left_join(col_mapping, by = "col_name") %>%
  pivot_wider(names_from = CLASS, values_from = value) %>%
  select(GROUP, CLASS_1, CLASS_2, Date)

方法2:拆分数据框后合并

把对应同一Date的列拆成单独数据框,添加Date标识后合并:

library(dplyr)

# 处理Date=1的列
df_date1 <- df %>%
  select(GROUP, CLASS_1 = CLASS_1_1, CLASS_2 = CLASS_2_1) %>%
  mutate(Date = "1")

# 处理Date=2的列
df_date2 <- df %>%
  select(GROUP, CLASS_1 = CLASS_1_2, CLASS_2 = CLASS_2_2) %>%
  mutate(Date = "2")

# 合并结果
bind_rows(df_date1, df_date2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:51:09