tidyr实现宽表转长表:多变量列重排问题求助
用tidyr实现多变量宽转长:合并地区列并保留Temp/Humidity
当然支持!tidyr的pivot_longer()函数完全能搞定这个需求,而且比base R的reshape()更灵活直观——你之前没成功应该是没用到它的.value特殊参数,这个参数就是专门用来处理多变量同时重塑的。
举个实际例子
假设你的原始宽格式数据是这样的(每列对应一个地区的Temp或Humidity):
# 模拟原始数据 df <- tibble( RegionA_Temp = c(22, 24, 26), RegionA_Humidity = c(58, 60, 62), RegionB_Temp = c(25, 27, 29), RegionB_Humidity = c(55, 57, 59) )
要把所有地区列合并成单列Region,同时保留Temp和Humidity作为独立变量,只需要用pivot_longer()配合正则表达式拆分列名:
library(tidyr) library(dplyr) # 用管道让代码更易读 df_long <- df %>% pivot_longer( cols = everything(), # 选中所有需要重塑的列(如果有其他列可以指定范围,比如starts_with("Region")) names_to = c("Region", ".value"), # 拆分列名为两部分:Region是地区名,.value表示保留原变量名(Temp/Humidity) names_pattern = "(.*)_(Temp|Humidity)" # 正则匹配:第一部分是地区,第二部分是变量类型 )
运行后得到的长格式数据就是你要的结果:
| Region | Temp | Humidity |
|---|---|---|
| RegionA | 22 | 58 |
| RegionA | 24 | 60 |
| RegionA | 26 | 62 |
| RegionB | 25 | 55 |
| RegionB | 27 | 57 |
| RegionB | 29 | 59 |
关键参数解释
names_to = c("Region", ".value"):这里的.value是tidyr的特殊语法,它告诉函数:列名中匹配到的第二部分(Temp/Humidity)要作为新的列名,而第一部分(RegionA/RegionB)作为Region列的取值。names_pattern:用正则表达式拆分原始列名,根据你的实际列名格式调整即可——比如如果列名是Temp_RegionA这种顺序,就把正则改成"(Temp|Humidity)_(.*)",同时names_to换成c(".value", "Region")。
对比base R的reshape
你之前用base R的reshape()能实现,对应的tidyr代码逻辑更清晰,尤其是当列名规则复杂时,正则匹配的灵活性更高。
内容的提问来源于stack exchange,提问作者Ricardo Cruz
相关产品推荐
相关产品推荐

