在group_by之后计算具有NA的列

时间:2019-07-18 07:28:11

标签: r group-by dplyr

我想计算使用group_by后具有NA值的列数。

一直在问类似的问题,但是计算总NA而不是NA(group by counting non NA)列

数据:

  Spes <- "Year Spec.1 Spec.2 Spec.3 Spec.4
    1      2016   5      NA     NA     5
    2      2016   1      NA     NA     6
    3      2016   6      NA     NA     4
    4      2018   NA     5      5      9
    5      2018   NA     4      7      3
    6      2018   NA     5      2      1
    7      2019   6      NA     NA     NA
    8      2019   4      NA     NA     NA
    9      2019   3      NA     NA     NA"

    Data <- read.table(text=spes, header = TRUE)
    Data$Year <- as.factor(Data$Year)

所需的输出:

2016 2
2018 1
2019 3

我已经尝试了几件事,这是我目前的最佳尝试。我很想寻求一种dplyr解决方案。

> Data %>% 
   group_by(Year) %>% 
   summarise_each(colSums(is.na(Data, [2:5])))

Error: Can't create call to non-callable object

我没有太多运气就尝试过变化。非常感谢

1 个答案:

答案 0 :(得分:1)

一个选择可能是group_by Year,检查每列中是否有any NA个值,然后为每个Year计算它们的总和。 / p>

library(dplyr)
Data %>%
   group_by(Year) %>%
   summarise_all(~any(is.na(.))) %>%
   mutate(output = rowSums(.[-1])) %>%
   select(Year, output)


# A tibble: 3 x 2
#  Year  output
#  <fct>  <dbl>
#1 2016       2
#2 2018       1
#3 2019       3

使用aggregate

的Base R翻译
rowSums(aggregate(.~Year, Data, function(x) 
             any(is.na(x)), na.action = "na.pass")[-1], na.rm = TRUE)
#[1] 2 1 3