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

