【问题标题】:How to count total non-na values using dplyr? [duplicate]如何使用 dplyr 计算总非 na 值? [复制]
【发布时间】:2020-09-16 22:56:11
【问题描述】:

数据

df <- structure(list(error_code = c("2892141", "2892141", "2892141", 
"2892141", "2892141", "2892141", "2892141", "2892141", "2892141", 
"2892141", "2892141", "2892141", "2892141", "2892141", "2892141", 
"2892141", "2907630", "2907630", "2907630", "2907630", "2907630", 
"2907630", "2907630", "2907630", "2907630", "2907630", "2907630", 
"2907630", "2907630", "2907630", "2907630", "2907630", "2907631", 
"2907631", "2907631", "2907631", "2907631", "2907631", "2907631", 
"2907631", "2907631", "2907631", "2907631", "2907631", "2907631", 
"2907631", "2907631", "2907631", "2907632", "2907632", "2907632", 
"2907632", "2907632", "2907632", "2907632", "2907632", "2907632", 
"2907632", "2907632", "2907632", "2907632", "2907632", "2907632", 
"2907632", "2907633", "2907633", "2907633", "2907633", "2907633", 
"2907633", "2907633", "2907633", "2907633", "2907633", "2907633", 
"2907633", "2907633", "2907633", "2907633", "2907633", "2907634", 
"2907634", "2907634", "2907634", "2907634", "2907634", "2907634", 
"2907634", "2907634", "2907634", "2907634", "2907634", "2907634", 
"2907634", "2907634", "2907634", "2907635", "2907635", "2907635", 
"2907635", "2907635", "2907635", "2907635", "2907635", "2907635", 
"2907635", "2907635", "2907635", "2907635", "2907635", "2907635", 
"2907635", "2907636", "2907636", "2907636", "2907636", "2907636", 
"2907636", "2907636", "2907636", "2907636", "2907636", "2907636", 
"2907636", "2907636", "2907636", "2907636", "2907636", "2907637", 
"2907637", "2907637", "2907637", "2907637", "2907637", "2907637", 
"2907637", "2907637", "2907637", "2907637", "2907637", "2907637", 
"2907637", "2907637", "2907637", "2907638", "2907638", "2907638", 
"2907638", "2907638", "2907638", "2907638", "2907638", "2907638", 
"2907638", "2907638", "2907638", "2907638", "2907638", "2907638", 
"2907638", "2907639", "2907639", "2907639", "2907639", "2907639", 
"2907639", "2907639", "2907639", "2907639", "2907639", "2907639", 
"2907639", "2907639", "2907639", "2907639", "2907639", "2907640", 
"2907640", "2907640", "2907640", "2907640", "2907640", "2907640", 
"2907640", "2907640", "2907640", "2907640", "2907640", "2907640", 
"2907640", "2907640", "2907640", "2907641", "2907641", "2907641", 
"2907641", "2907641", "2907641", "2907641", "2907641", "2907641", 
"2907641", "2907641", "2907641", "2907641", "2907641", "2907641", 
"2907641", "2907642", "2907642", "2907642", "2907642", "2907642", 
"2907642", "2907642", "2907642", "2907642", "2907642", "2907642", 
"2907642", "2907642", "2907642", "2907642", "2907642", "2907644", 
"2907644", "2907644", "2907644", "2907644", "2907644", "2907644", 
"2907644", "2907644", "2907644", "2907644", "2907644", "2907644", 
"2907644", "2907644", "2907644", "2907645", "2907645", "2907645", 
"2907645", "2907645", "2907645", "2907645", "2907645", "2907645", 
"2907645", "2907645", "2907645", "2907645", "2907645", "2907645", 
"2907645"), value = c(" ", NA, NA, NA, "2", NA, NA, NA, NA, "1", 
"1", "2", "2", NA, "2", "2", NA, NA, " ", NA, NA, NA, NA, "1", 
NA, "2", "2", "2", NA, NA, NA, NA, "2", NA, " ", NA, NA, NA, 
"1", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "2", " ", NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "2", NA, NA, NA, 
NA, NA, NA, NA, "1", "2", NA, NA, " ", NA, NA, NA, "2", NA, NA, 
NA, "2", NA, "1", NA, "2", NA, NA, NA, "2", NA, " ", NA, "2", 
" ", NA, NA, NA, "2", NA, NA, NA, "2", NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, "2", NA, "1", "1", "2", NA, NA, " ", 
"2", "2", " ", "2", "2", NA, "1", "2", "2", NA, "1", NA, NA, 
"1", "2", NA, NA, "1", NA, NA, "1", "1", NA, "1", "2", NA, "1", 
"2", NA, "2", "2", " ", "1", "2", " ", NA, NA, NA, NA, NA, NA, 
NA, "2", NA, NA, "2", NA, NA, NA, "2", NA, NA, "2", NA, NA, "1", 
"1", NA, NA, "2", NA, NA, NA, " ", "2", "2", NA, NA, "2", "2", 
NA, NA, NA, "2", NA, NA, NA, NA, NA, NA, " ", " ", NA, NA, "2", 
"2", NA, NA, NA, NA, "2", NA, NA, NA, NA, NA, NA, "1", NA, "2", 
NA, "1", NA, "1", "2", "1", "2", NA, NA, NA, NA, NA, " ", NA, 
NA, "2", NA, NA, NA, "1", NA, "1", NA, "1", " ", NA, NA, "1", 
"1")), row.names = c(NA, -256L), class = "data.frame")

我想对每个 error_codes 进行分组并计算其中有多少具有非 na 值。这只是列名称为value 的数据的一部分,但还有其他列名称具有相似值但称为其他名称。

所以,我将列名存储在需要的变量中。

categoryColumn <- getCategoryColumnName(categoryId)

在这种情况下,categoryColumn 将是 value。然后,对所有非 na 行进行分组和提取,这就是我所做的

df%>% group_by(error_code) %>% select(categoryColumn) %>% summarise(ties = sum(is.na(.)))

上面的代码给了我这个:

  error_code         value
 1 2892141           162
 2 2907630           162
 3 2907631           162
 4 2907632           162
 5 2907633           162
 6 2907634           162
 7 2907635           162
 8 2907636           162
 9 2907637           162
10 2907638           162
11 2907639           162
12 2907640           162
13 2907641           162
14 2907642           162
15 2907644           162
16 2907645           162

这不准确。如何获得与非 na 值相关的值?

【问题讨论】:

    标签: r dplyr group-by


    【解决方案1】:

    如果是非NA的计数,则创建一个逻辑向量(!is.na(value))并获取sum

    library(dplyr)
    df %>%
          group_by(error_code) %>%
          summarise(value = sum(!is.na(value)))
    

    如果列名/名称存储在一个对象中,请使用across,因为它是通用的并且可以用于多个列

    df %>%
       group_by(error_code) %>%
       summarise(across(categoryColumn, ~ sum(!is.na(.))))
    

    across 之外的sum(is.na(.)) 将检查所有元素的总sum,因为. 意味着整个数据集而不是列本身

    【讨论】:

    • 太好了!我在尝试多件事时不小心错过了代码中的sum(!is.na()),但结果仍然相同。但是您使用across 的第二个代码效果很好。这正是我一直在寻找的。谢谢!!
    【解决方案2】:

    base R 的解决方案是:

    #Code
    aggregate(value~error_code,df,FUN = function(x) length(which(!is.na(x))))
    

    输出:

       error_code value
    1     2892141     8
    2     2907630     5
    3     2907631     3
    4     2907632     2
    5     2907633     4
    6     2907634     6
    7     2907635     4
    8     2907636     6
    9     2907637    10
    10    2907638    11
    11    2907639     4
    12    2907640     7
    13    2907641     5
    14    2907642     4
    15    2907644     8
    16    2907645     7
    

    【讨论】:

      猜你喜欢
      • 2022-12-20
      • 2022-11-03
      • 2017-11-01
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 1970-01-01
      相关资源
      最近更新 更多