【问题标题】:How do you use dplyr::pull to convert grouped a colum into vectors?如何使用 dplyr::pull 将 groupby 列转换为向量?
【发布时间】:2021-02-26 07:41:50
【问题描述】:

我有一个 tibble,df,我想获取 tibble 并将其分组,然后使用 dplyr::pull 从分组的数据帧创建向量。我在下面提供了一个代表。

df 是基础 tibble。 df2 反映了我想要的输出。我只是不知道如何以编程方式到达那里。我尝试使用 pull 来实现此输出,但 pull 似乎无法识别 group_by 函数,而是从整个列中创建了一个向量。是我试图通过 dplyr 或 base r 实现的目标。注意 - new_col 应该是从 name 列创建的向量。

library(tidyverse)
library(reprex)

df <- tibble(group = c(1,1,1,1,2,2,2,3,3,3,3,3),
             name = c('Jim','Deb','Bill','Ann','Joe','Jon','Jane','Jake','Sam','Gus','Trixy','Don'),
             type = c(1,2,3,4,3,2,1,2,3,1,4,5))

df
#> # A tibble: 12 x 3
#>    group name   type
#>    <dbl> <chr> <dbl>
#>  1     1 Jim       1
#>  2     1 Deb       2
#>  3     1 Bill      3
#>  4     1 Ann       4
#>  5     2 Joe       3
#>  6     2 Jon       2
#>  7     2 Jane      1
#>  8     3 Jake      2
#>  9     3 Sam       3
#> 10     3 Gus       1
#> 11     3 Trixy     4
#> 12     3 Don       5

# Desired Output - New Col is a column of vectors

df2 <- tibble(group=c(1,2,3),name=c("Jim","Jane","Gus"), type=c(1,1,1), new_col = c("'Jim','Deb','Bill','Ann'","'Joe','Jon','Jane'","'Jake','Sam','Gus','Trixy','Don'"))
df2
#> # A tibble: 3 x 4
#>   group name   type new_col                         
#>   <dbl> <chr> <dbl> <chr>                           
#> 1     1 Jim       1 'Jim','Deb','Bill','Ann'        
#> 2     2 Jane      1 'Joe','Jon','Jane'              
#> 3     3 Gus       1 'Jake','Sam','Gus','Trixy','Don'
Created on 2020-11-14 by the reprex package (v0.3.0)

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    也许这就是你要找的东西:

    library(dplyr)
    
    df <- tibble(group = c(1,1,1,1,2,2,2,3,3,3,3,3),
                 name = c('Jim','Deb','Bill','Ann','Joe','Jon','Jane','Jake','Sam','Gus','Trixy','Don'),
                 type = c(1,2,3,4,3,2,1,2,3,1,4,5))
    
    df %>% 
      group_by(group) %>%
      mutate(new_col = name, name = first(name, order_by = type), type = first(type, order_by = type)) %>% 
      group_by(name, type, .add = TRUE) %>% 
      summarise(new_col = paste(new_col, collapse = ","))
    #> `summarise()` regrouping output by 'group', 'name' (override with `.groups` argument)
    #> # A tibble: 3 x 4
    #> # Groups:   group, name [3]
    #>   group name   type new_col               
    #>   <dbl> <chr> <dbl> <chr>                 
    #> 1     1 Jim       1 Jim,Deb,Bill,Ann      
    #> 2     2 Jane      1 Joe,Jon,Jane          
    #> 3     3 Gus       1 Jake,Sam,Gus,Trixy,Don
    

    编辑如果new_col 应该是向量列表,那么您可以执行 `summarise(new_col = list(c(new_col)))

    df %>% 
      group_by(group) %>%
      mutate(new_col = name, name = first(name, order_by = type), type = first(type, order_by = type)) %>% 
      group_by(name, type, .add = TRUE) %>% 
      summarise(new_col = list(c(new_col)))
    

    另一种选择是使用tidyr::nest

    df %>% 
      group_by(group) %>%
      mutate(new_col = name, name = first(name, order_by = type), type = first(type, order_by = type)) %>% 
      nest(new_col = new_col)
    

    【讨论】:

    • 感谢您的回复,这与我正在寻找的非常接近,但是如果您要执行 length(new_col) ,则每行的答案将为 1,我希望它为 4 ,3 和 5。
    • 好的。我知道了。示例输出有点误导。我刚刚使用两个选项进行了编辑,以获得(更接近)您想要的结果。
    猜你喜欢
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多