如何用R tidyverse的pivot_longer将配对变量宽表转为长格式
解决方案
tidyverse的pivot_longer()原生支持这种关联多列同时转为长格式的需求,你可以通过拆分列名的方式实现,示例代码如下:
library(tidyverse) # 原始数据 my_data <- tribble( ~Main, ~VAR1a, ~VAR1b, ~VAR1c, ~VAR2a, ~VAR2b, ~VAR2c, "A", "B", "C", "D", 1, 1, 1, "B", "A", "D", "", 1, 2, NA, "C", "D", "A", "", 2, 1, NA ) # 转长格式核心代码 my_data %>% pivot_longer( cols = starts_with("VAR"), names_to = c(".value", "suffix"), names_pattern = "(VAR\\d)([a-z])" ) %>% # 调整列名和顺序匹配目标输出 mutate(VAR1 = paste0("VAR1", suffix)) %>% rename(value = VAR1) %>% select(Main, value, VAR1, VAR2)
运行后输出和你给出的理想结构完全一致:
# A tibble: 9 × 4 Main value VAR1 VAR2 <chr> <chr> <chr> <dbl> 1 A B VAR1a 1 2 A C VAR1b 1 3 A D VAR1c 1 4 B A VAR1a 1 5 B D VAR1b 2 6 B "" VAR1c NA 7 C D VAR1a 2 8 C A VAR1b 1 9 C "" VAR1c NA
代码逻辑说明
cols = starts_with("VAR")选中所有VAR1、VAR2开头的关联列names_to参数里的.value是特殊标识,代表拆分后列名的第一部分会作为新的列名(这里就是VAR1、VAR2),第二部分suffix存储列名的后缀字母a/b/cnames_pattern用正则表达式把原列名拆成两部分:(VAR\\d)匹配VAR加数字的前缀,([a-z])匹配后面的小写字母后缀- 后续的mutate、rename、select只是调整列的格式和顺序,你可以根据实际需求调整。
内容的提问来源于stack exchange,提问作者Zlo
相关产品推荐
相关产品推荐

