首页 > 解决方案 > 如何将基于键的行与组合在单个列中的值组合

问题描述

我尝试了不同的方法,但我需要做的是将不同行的列的值组合成具有一列的单行。我知道这不是规范化的数据,但这种方式更容易理解。

我试过的:

数据集

#dataset
# A tibble: 10 x 3
      id   key value
   <dbl> <dbl> <chr>
 1     1     1 h    
 2     2     1 e    
 3     3     1 l    
 4     4     1 l    
 5     5     1 o    
 6     6     2 w    
 7     7     2 o    
 8     8     2 r    
 9     9     2 l    
10    10     2 d  
test <- tribble(~id, ~key, ~value,
                1, 1, "h",
                2, 1, "e",
                3, 1, "l",
                4, 1, "l",
                5, 1, "o",
                6, 2, "w",
                7, 2, "o",
                8, 2, "r",
                9, 2, "l",
                10,2, "d")

# pivot_wider() doesnt work
result <- test %>%  pivot_wider(names_from = "key", values_from = "value")

我需要的

# A tibble: 2 x 2
    key value    
  <dbl> <list>   
1     1 <chr [5]>
2     2 <chr [5]>

expected <- tribble(~key, ~value,
                    1, c("h", "e", "l", "l","o"),
                    2, c("w", "o", "r", "l", "d"))

顺序无关紧要,但我确实需要将它们放在同一列中


expected <- tribble(~key, ~value,
                    1, c("e", "l", "l", "h","o"),
                    2, c("r", "o", "d", "l", "w"))

标签: r

解决方案


利用tidyr::nest_by()

library(tidyverse)
test <- tribble(~id, ~key, ~value,
                1, 1, "h",
                2, 1, "e",
                3, 1, "l",
                4, 1, "l",
                5, 1, "o",
                6, 2, "w",
                7, 2, "o",
                8, 2, "r",
                9, 2, "l",
                10,2, "d")

test %>% select(-id) %>% nest_by(key)
#> # A tibble: 2 x 2
#> # Rowwise:  key
#>     key               data
#>   <dbl> <list<tibble[,1]>>
#> 1     1            [5 x 1]
#> 2     2            [5 x 1]

或者只是在 dplyr

test %>% group_by(key) %>%
  summarise(value = list(value))

#> # A tibble: 2 x 2
#>     key value    
#>   <dbl> <list>   
#> 1     1 <chr [5]>
#> 2     2 <chr [5]>

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


推荐阅读