如何在 R 中正确格式化我的面板数据?

How to properly format my panel data in R?

我知道存在类似的问题,但我已经尝试了从熔化到重塑到堆叠等所有方法,但没有什么能让我更接近。

我的数据目前是这样的:

ID Treatment Round_1_Decision1 Round_1_Decision2 Round_2_Decision1 Round_2_Decision2
1      2            1                0                0                1
2      1            0                0                1                1

我需要它看起来像这样:

ID Treatment Round Decision1 Decision2
1      2       1       1         0
1      2       2       0         1
2      1       1       0         0
2      1       2       1         1

有什么建议吗?

我们可能会使用pivot_longer——主要要考虑的是names_tonames_pattern。在这里,我们需要 'Round' 列,该列应生成值作为列名中 'Round' 的后缀,另一列作为列的值 (.value)。在 names_pattern 中,将列名称子字符串捕获为具有捕获组 ((...)) 的组,即 -\w+ - 应匹配 'Round',后跟 _,然后捕获数字 ((\d+)),然后是下划线 (_),然后是下一个捕获组 ((.*)),其中包含 [=16] 的其余字符=]部分

library(tidyr)
pivot_longer(df1, cols = starts_with("Round"),
     names_to = c("Round", ".value"), names_pattern = "\w+_(\d+)_(.*)")

-输出

# A tibble: 4 × 5
     ID Treatment Round Decision1 Decision2
  <int>     <int> <chr>     <int>     <int>
1     1         2 1             1         0
2     1         2 2             0         1
3     2         1 1             0         0
4     2         1 2             1         1

数据

df1 <- structure(list(ID = 1:2, Treatment = 2:1, Round_1_Decision1 = 1:0, 
    Round_1_Decision2 = c(0L, 0L), 
Round_2_Decision1 = 0:1, Round_2_Decision2 = c(1L, 
    1L)), class = "data.frame", row.names = c(NA, -2L))

这是一种不使用 names_pattern 参数的替代方法

library(tidyverse)

df %>% 
  pivot_longer(
    cols=-c(ID, Treatment),
    names_to = "Round",
    values_to = "value"
  ) %>% 
  mutate(Decision = str_sub(Round, -9, -1),
         Round = parse_number(Round)
         ) %>% 
  pivot_wider(
    names_from = Decision,
    values_from = value
  )
     ID Treatment Round Decision1 Decision2
  <int>     <int> <dbl>     <int>     <int>
1     1         2     1         1         0
2     1         2     2         0         1
3     2         1     1         0         0
4     2         1     2         1         1