【问题标题】:Counting columns with NAs after group_by在 group_by 之后计算具有 NA 的列
【发布时间】:2019-07-18 15:45:19
【问题描述】:

我想计算使用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

我尝试过各种变化,但运气不佳。非常感谢

【问题讨论】:

  • no applicable method for 'filter_' applied to an object of class "c('matrix', 'logical') 将对此进行试验!谢谢

标签: r group-by dplyr


【解决方案1】:

一个选项可以是group_byYear,检查每列中是否有anyNA 值并计算每个Year 的总和。

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进行基础R翻译

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

【讨论】:

  • 有效!非常感谢,会尽快回复。
  • 我很厚脸皮,但我可以添加一行来返回列名吗?如果有快速修复,将编辑问题
  • @Jim 你想返回哪些列名?
  • this with NA present,示例输出:2016 2 Spec.2,Spec.3(我意识到这不是 SO 上的正确协议,我将相应地编辑问题)
  • @Jim 所以像Data %&gt;% group_by(Year) %&gt;% summarise_all(~any(is.na(.))) %&gt;% gather(key, value, -Year) %&gt;% filter(value) %&gt;% select(-value) 这样的东西会有帮助吗?
猜你喜欢
  • 2023-01-11
  • 2022-01-17
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
相关资源
最近更新 更多