r - 仅对非NA元素求和,但如果所有NA都返回NA

标签 r data.table

我想我已经对这些评论获得了非常好的回答,但是我将重新表述该问题以供将来引用。

我正在尝试使用data.table进行分组汇总。问题在于,某些组只有具有NA。对于这些组,我希望总和返回NA。但是,如果存在一组值与NA不同的组,我想获得非NA值的总和。

A <- data.table(col1= c('A','A','B','B','C','C'),  
                col2= c(NA,NA,2,3,NA,4))

这没有添加参数na.rm = T,C组应返回4时返回NA。
A[, sum(col2), by = .(col1)]
   col1 V1
1:    A NA
2:    B  5
3:    C NA

但是,添加na.rm = T时应返回NA时,在A组中返回0。
A[, sum(col2, na.rm = T), by = .(col1)]
   col1 V1
1:    A  0
2:    B  5
3:    C  4

我最喜欢的方法是Sandipan在评论中建议的方法,类似于我在下面编写的功能:
ifelse(all(is.na(col2)), NA, sum(col2, na.rm = T)

我创建了一个函数来解决它,但是我不确定是否已经有内置的方法来解决这个问题:
sum.na <- function(df){

  if (all(is.na(df))){

    suma <- NA
  }  
  else {    
    suma <- sum(df, na.rm = T)
  }

  return(suma)
}

最佳答案

根据其他用户的建议,我将发布问题的答案。该解决方案由@sandipan在上面的评论中提供:

如问题中所述,如果您需要对包含NA的一列的值求和,则有两种不错的方法:

1)使用ifelse:

A[, (ifelse(all(is.na(col2)), col2[NA_integer_], sum(col2, na.rm = T))), 
  by = .(col1)]

2)定义@Frank建议的功能:
suma = function(x) if (all(is.na(x))) x[NA_integer_] else sum(x, na.rm = TRUE)

A[, suma(col2), by = .(col1)]

请注意,正如@Frank所指出的,我添加了NA_integer_,因为我一直在获取有关类型的错误。

关于r - 仅对非NA元素求和,但如果所有NA都返回NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41470277/

相关文章:

r - 在语料库的每个文档中查找最频繁的术语

基于列组的列随机抽样

r - R 初学者 - 表操作基础

xml - R readHTMLTable 无法加载外部实体

r - 使用数据类型名称列表更改数据类型

r data.table lapply 或 for 循环创建变量或生成列

r - 如何选择一行,然后转置它,然后将它与 R 中的其余部分堆叠在一起?

r - 避免 data.table 强制 j 中的列表返回列

r - 根据在 R 中的 pickerInput 1 中选择的值更新 pickerInput 2 中的选项

r - R中将月度数据转换为日表