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

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)" # 正则匹配:第一部分是地区,第二部分是变量类型
  )

运行后得到的长格式数据就是你要的结果:

RegionTempHumidity
RegionA2258
RegionA2460
RegionA2662
RegionB2555
RegionB2757
RegionB2959

关键参数解释

  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:15:53