R:计算具有变量的每个值的组的数量?

问题描述 投票:0回答:1

样本数据:

tibble::tibble(id = c("101", "101", "101", "102", "102", "103"), 
    color = c("Blue", "Blue", "Red", "Red", "Green", "Green"))

#> # A tibble: 6 × 2
#>   id    color 
#>   <chr> <chr> 
#> 1 101   Blue  
#> 2 101   Blue  
#> 3 101   Red   
#> 4 102   Red   
#> 5 102   Green 
#> 6 103   Green

创建于 2024-09-05,使用 reprex v2.1.1

我想计算对于每个

id
值,具有特定
color
值的
color
的数量。

示例输出:

tibble::tibble(color = c("Blue", "Red", "Green"), number_of_ids_having_color = c("1", 
    "2", "2"))

#> # A tibble: 3 × 2
#>   color number_of_ids_having_color
#>   <chr>       <chr>                           
#> 1 Blue        1                               
#> 2 Red         2                               
#> 3 Green       2

创建于 2024-09-05,使用 reprex v2.1.1

这有点类似于这个问题,区别在于(a)我的条件变量是分类的,(b)我想对所述变量的每个值进行计算。


作为一个额外的小问题(优先级较低),假设我还有另一个变量

most_important_color
,我还想计算
id
的每种颜色作为其
most_important_color
的数量:

tibble::tibble(id = c("101", "101", "101", "102", "102", "103"), 
    color = c("Blue", "Blue", "Red", "Red", "Green", "Green"), 
    most_important_color = c("F", "F", "T", "T", "F", "T"))

#> # A tibble: 6 × 3
#>   id    color most_important_color
#>   <chr> <chr>       <chr>               
#> 1 101   Blue        F                   
#> 2 101   Blue        F                   
#> 3 101   Red         T                   
#> 4 102   Red         T                   
#> 5 102   Green       F                   
#> 6 103   Green       T

创建于 2024-09-05,使用 reprex v2.1.1

最终产品,将解决方案纳入我的第一个(也是更重要的问题),如下所示:

tibble::tibble(color_group = c("Blue", "Red", "Green"), number_of_ids_having_color = c("1", 
    "2", "2"), number_of_ids_having_color_as_most_important = c("0", 
    "2", "1"))

#> # A tibble: 3 × 3
#>   color_group number_of_ids_having_color number_of_ids_having_color_as_most_im…¹
#>   <chr>       <chr>                      <chr>                                  
#> 1 Blue        1                          0                                      
#> 2 Red         2                          2                                      
#> 3 Green       2                          1                                      
#> # ℹ abbreviated name: ¹​number_of_ids_having_color_as_most_important

创建于 2024-09-05,使用 reprex v2.1.1

单独执行此操作,然后将该操作的结果连接到上面的操作结果是相当简单的,但我感兴趣是否有一种方法可以在单个管道中完成所有这些操作,而无需创建中间对象并将它们连接起来。

Tidyverse 解决方案是强烈首选,因为我与最熟悉 tidyverse 的人分享此代码。

谢谢!

r dplyr tidyverse
1个回答
0
投票

第一个问题很简单地回答了

X = data.frame(id = c("101", "101", "101", "102", "102", "103"), 
               color = c("Blue", "Blue", "Red", "Red", "Green", "Green"))

aggregate(id~color, X[!duplicated(X), ], length)

给予

  color id
1  Blue  1
2 Green  2
3   Red  2

它的

{dplyr}
对应:

library(dplyr)
X |> 
  distinct() |>
  summarise(number_of_ids_having_color = length(id), .by = color)


给予

  color number_of_ids_having_color
1  Blue                          1
2   Red                          2
3 Green                          2
© www.soinside.com 2019 - 2024. All rights reserved.