如何在R中正确将宽结构面板数据格式化为长结构
可行实现方案
Python(pandas ≥ 1.3.0)
直接使用pandas内置的pivot_longer方法,匹配列名规则直接完成转换,无需额外拆分拼接:
import pandas as pd # 你的原始数据 df = pd.DataFrame({ "ID": [1, 2], "Treatment": [2, 1], "Round_1_Decision1": [1, 0], "Round_1_Decision2": [0, 0], "Round_2_Decision1": [0, 1], "Round_2_Decision2": [1, 1] }) # 宽转长核心代码 result = df.pivot_longer( index=["ID", "Treatment"], names_pattern=r"Round_(\d+)_(Decision\d)", names_to=["Round", ".value"] )
如果你用的是低版本pandas,也可以配合列名重命名+wide_to_long实现,逻辑完全一致。
R(tidyverse)
使用tidyr的pivot_longer方法,语法逻辑和pandas版本基本一致:
library(tidyverse) # 你的原始数据 df <- tibble( ID = c(1, 2), Treatment = c(2, 1), Round_1_Decision1 = c(1, 0), Round_1_Decision2 = c(0, 0), Round_2_Decision1 = c(0, 1), Round_2_Decision2 = c(1, 1) ) # 宽转长核心代码 result <- df %>% pivot_longer( cols = starts_with("Round"), names_pattern = "Round_(\\d+)_(Decision\\d)", names_to = c("Round", ".value") )
以上两种方案都直接适配你当前的列名规则,不需要你手动对melt/stack的结果做二次拆分、拼接,不会出现维度错位问题,运行结果完全符合你需要的输出结构。
内容的提问来源于stack exchange,提问作者Cameron Kormylo
相关产品推荐
相关产品推荐

