【问题标题】:How to properly format my panel data in R?如何在 R 中正确格式化我的面板数据?
【发布时间】:2021-12-20 06:46:28
【问题描述】:

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

我的数据目前如下所示:

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

有什么建议吗?

【问题讨论】:

    标签: r panel reshape melt


    【解决方案1】:

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

    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))
    

    【讨论】:

    • 哇,真快。这几乎可以完美运行,但我有 20 轮,并且此代码仅报告第二个数字(例如,对于第 17 轮,它仅在 Round 列中显示“7”)。我该如何解决?
    • @CameronKormylo 你能把代码改成names_pattern = "\\w+(\\d+)_(.*)")。 Round和17之间有空格吗?在显示的数据中,它没有显示任何空格,即 Round17。如果是这种情况,代码应该可以在没有任何修改的情况下工作,即 Round 和 17 之间没有任何空格
    • 抱歉,真正的命名约定是 Round_17_Decision1
    • @CameronKormylo 在这种情况下将模式更改为"\\w+_(\\d+)_(.*)"
    • 谢谢。这很完美。一旦允许,我会接受这个答案。它说我必须再等 3 分钟。
    【解决方案2】:

    这是一种不使用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
    

    【讨论】:

      猜你喜欢
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 2014-01-07
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多