【问题标题】:Count certain values of column in group id计算组 id 中列的某些值
【发布时间】:2021-10-20 21:34:34
【问题描述】:

我试着统计A's的组内id个数。

df<- data.frame( id= c(1, 1, 1, 1,  2, 2, 2, 2,  2, 2, 3, 3, 3,3 ,3,3,4,4,4, 5,5,6,6), value= c(NA, NA,"A", "A", NA,NA,"A","A","B","A",NA,NA,"B","A","B","A", NA, NA,"B",NA, NA, NA,NA))

期望的输出

 id value number_A
  1   NA        2
  1   NA        2
  1     A        2
  1     A        2
  2   NA        3
  2   NA        3
  2     A        3
  2     A        3
  2     B        3
  2     A        3
  3   NA         2
  3   NA         2
  3     B        2
  3     A        2
  3     B        2
  3     A        2
  4   NA         0
  4   NA         0
  4     B        0
  5   NA         0
  5   NA         0
  6   NA         0
  6   NA         0

我用下面的代码试试:

library(dplyr)
df1 <- df %>% group_by(id) %>% 
  mutate(count =  row_number(value=="A"))

【问题讨论】:

标签: r dplyr


【解决方案1】:

使用aggregate 函数的基本解决方案。

df<- data.frame( id= c(1, 1, 1, 1,  2, 2, 2, 2,  2, 2, 3, 3, 3,3 ,3,3,4,4,4, 5,5,6,6), value= c(NA, NA,"A", "A", NA,NA,"A","A","B","A",NA,NA,"B","A","B","A", NA, NA,"B",NA, NA, NA,NA))

# Calculate the number of A for each group id:
countA = aggregate(value ~ id, data=df, FUN=function(x){sum(x=="A", na.rm=TRUE))}, na.omit=na.pass)
countA
#   id value
# 1  1     2
# 2  2     3
# 3  3     2
# 4  4     0
# 5  5     0
# 6  6     0

# Set the value in countA to "countA" and merge with df
names(countA)[2] = "countA"
merge(df, countA, by="id")
#   id value countA
#1   1  <NA>      2
#2   1  <NA>      2
#3   1     A      2
#4   1     A      2
#5   2  <NA>      3
#6   2  <NA>      3
# ...

解释:

aggregateby 变量定义的组计算汇总函数。或者,可以使用公式来提供这种关系。

function(x){sum(x=="A", na.rm=TRUE)} 只是计算 A 值的总和,并删除否则会冒泡的 NAs。

最后,默认情况下,聚合会删除带有NAs 的值,这会导致某些组无法表示。这是由规则 na.omit=na.pass 修复的,该规则抑制了这种行为。

之后,我们只需将聚合结果中的一列和merge 重命名为id 列中的两个data.frames

【讨论】:

    【解决方案2】:

    你可以使用

    library(dplyr)
    
    df %>% 
      group_by(id) %>% 
      mutate(number_A = sum(value == "A", na.rm = TRUE)) %>% 
      ungroup()
    

    返回

    # A tibble: 23 x 3
          id value number_A
       <dbl> <chr>    <int>
     1     1 NA           2
     2     1 NA           2
     3     1 A            2
     4     1 A            2
     5     2 NA           3
     6     2 NA           3
     7     2 A            3
     8     2 A            3
     9     2 B            3
    10     2 A            3
    # ... with 13 more rows
    

    【讨论】:

      【解决方案3】:

      另一种解决方案:

      df %>% 
        add_count(id, wt = value=="A", name = "number_A")
      

      【讨论】:

      • 不幸的是,这也计算了除"A" 之外的其他值,这不是 OP 的意图。
      • 你说得对,@MartinGal:我误读了 OP 的要求...
      • 我刚刚编辑了我的解决方案,并考虑了您的评论,@MartinGal。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 2015-07-14
      • 2020-11-28
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      相关资源
      最近更新 更多