首页 > 解决方案 > 如何将数据从长转换为宽并合并

问题描述

我是 R 的初学者,所以有一个非常基本的问题。

我想将数据库从长转换为宽。我还需要将一列与行的标题之一合并。原始数据将如下所示:

试用号 时间点 副作用1级 副作用2级
1 6 0 1
1 12 3 2
1 24 2 0
2 3 1 2
2 6 1 3
2 24 2 0

我真正需要的是每个患者有 1 行,并且副作用标题与时间点合并,以这种方式组织:

试用号 副作用1grade_3 副作用1grade_6 副作用1grade_12 副作用1级_24 副作用2grade_3 副作用2grade_6 副作用2grade_12 副作用2grade_24
1 0 3 2 1 2 0
2 1 1 2 2 3 0

有人能帮忙吗?我一直在阅读很多东西,但还没有真正走得更远。您的帮助将不胜感激。抱歉,如果这是一个初学者的问题。谢谢!

标签: r

解决方案


df <- read.table(text = 'Trial_number   timepoint   side_effect1_grade  side_effect2_grade
1   6   0   1
1   12  3   2
1   24  2   0
2   3   1   2
2   6   1   3
2   24  2   0', header = T)

df
#>   Trial_number timepoint side_effect1_grade side_effect2_grade
#> 1            1         6                  0                  1
#> 2            1        12                  3                  2
#> 3            1        24                  2                  0
#> 4            2         3                  1                  2
#> 5            2         6                  1                  3
#> 6            2        24                  2                  0
library(tidyr, warn.conflicts = T)

df %>% pivot_wider(names_from = timepoint, values_from = c(side_effect1_grade, side_effect2_grade), names_sep = '_')
#> # A tibble: 2 x 9
#>   Trial_number side_effect1_grade_6 side_effect1_grade_12 side_effect1_grade_24
#>          <int>                <int>                 <int>                 <int>
#> 1            1                    0                     3                     2
#> 2            2                    1                    NA                     2
#> # ... with 5 more variables: side_effect1_grade_3 <int>,
#> #   side_effect2_grade_6 <int>, side_effect2_grade_12 <int>,
#> #   side_effect2_grade_24 <int>, side_effect2_grade_3 <int>

reprex 包于 2021-07-09 创建 (v2.0.0 )


推荐阅读