【问题标题】:Row values to columns in RR中的行值到列
【发布时间】:2020-02-12 12:17:40
【问题描述】:

我是 R 新手,我正在尝试构建我的第一个回归模型。但是,我正在努力转换我的数据。

我的数据按以下格式组织:

resp_id  task_id  alt  A_1  B_1   C_1   D_1   E_1
1        25       1    3    0.4   0.15  0     0
1        25       2    2    0.7   0.05  0.05  0
1        26       1    1    0.4   0     0     0
1        26       2    3    0.4   0.05  0.1   0.05

我正在寻找一种方法将我的数据从上面的格式转换为下面的格式:

resp_id  task_id  alt  A_1  B_1   C_1   D_1   E_1   A_2  B_2  C_2  D_2  E_2
1        25       1    3    0.4   0.15  0     0     2    0.7  0.05 0.05 0
1        26       1    1    0.4   0     0     0     3    0.4  0.05 0.1  0.05 

从概念上讲,我知道我需要遍历每一行,直到我们到达值为 2 的“alt”列。然后,该行中的所有下一列值都需要作为新列复制到前一行和该行需要删除从中复制值的位置。

我研究了在 R 中从长数据集到宽数据集的方法,但我无法将我的数据集转换为我想要的。

鉴于我缺乏编程经验,有人可以帮助我吗?

【问题讨论】:

    标签: r data-transform


    【解决方案1】:

    这是pivot_wider 的工作,来自tidyr 包:

    library(tidyverse)
    
    df %>%
      # remove the existing suffix and instead use alt to enumerate the columns
      rename_at(vars(A_1:E_1), ~gsub("_[0-9]*$", "", .)) %>%
      pivot_wider(names_from = alt, values_from = A:E)
    

    结果:

    # A tibble: 2 x 12
      resp_id task_id   A_1   A_2   B_1   B_2   C_1   C_2   D_1   D_2   E_1   E_2
        <int>   <int> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    1       1      25     3     2   0.4   0.7  0.15  0.05     0  0.05     0  0   
    2       1      26     1     3   0.4   0.4  0     0.05     0  0.1      0  0.05
    

    【讨论】:

      【解决方案2】:

      前段时间我也在为这样的转变而苦苦挣扎。我一直在寻找最简单的解决方案。在这种情况下,我想推荐reshape

      reshape(df, direction = "wide", timevar = "alt", idvar = "task_id", sep = "")
      
        task_id resp_id1 A_11 B_11 C_11 D_11 E_11 resp_id2 A_12 B_12 C_12 D_12 E_12
      1      25        1    3  0.4 0.15    0    0        1    2  0.7 0.05 0.05 0.00
      3      26        1    1  0.4 0.00    0    0        1    3  0.4 0.05 0.10 0.05
      

      【讨论】:

      • 感谢两位的建议。我设法让这两种解决方案都能正常工作,非常感谢!
      猜你喜欢
      • 1970-01-01
      • 2022-12-18
      • 2018-07-25
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 2016-09-12
      • 2018-08-18
      相关资源
      最近更新 更多