R lang表行到列的传播

时间:2018-03-05 22:01:11

标签: r dplyr rlang

我正在寻找一种方法将N行分散到R列中。示例输入 - >输出

给出一个表格,我想将那些年份的行分散到列

id | year | val_1 | val_2 | val_3
---|------|-------|-------|------
1  | 2001 | 10    | 11    | 12
2  | 2001 | 21    | 22    | 22
3  | 2002 | 31    | 32    | 32
3  | 2002 | 41    | 42    | 42

如下所示:

id | year | val_1_1 | val_2_1 | val_3_1 | val_1_2 | val_2_2 | val_3_2
---|------|---------|---------|---------|---------|---------|--------
1  | 2001 | 10      | 11      | 12      | 20      | 21      | 22
2  | 2002 | 30      | 31      | 32      | 40      | 41      | 42

1 个答案:

答案 0 :(得分:1)

如果使用tidyverse,您需要先重新整形为长形式,这样您才能先创建新的列名,然后重塑为更宽的形式:

library(tidyverse)

df <- data_frame(id = c(1L, 2L, 3L, 3L), 
                 year = c(2001L, 2001L, 2002L, 2002L), 
                 val_1 = c(10L, 21L, 31L, 41L), 
                 val_2 = c(11L, 22L, 32L, 42L), 
                 val_3 = c(12L, 22L, 32L, 42L))

df %>% 
    gather(val_n, val, contains('val')) %>%    # gather to long form
    group_by(year, val_n) %>% 
    mutate(val_n_n = paste(val_n, row_number(), sep = '_')) %>%    # make new column names
    ungroup() %>% select(-id, -val_n) %>%    # clean up
    spread(val_n_n, val)    # spread back to wide form
#> # A tibble: 2 x 7
#>    year val_1_1 val_1_2 val_2_1 val_2_2 val_3_1 val_3_2
#>   <int>   <int>   <int>   <int>   <int>   <int>   <int>
#> 1  2001      10      21      11      22      12      22
#> 2  2002      31      41      32      42      32      42