首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只和非NA元素,但如果所有NA都返回NA

只和非NA元素,但如果所有NA都返回NA
EN

Stack Overflow用户
提问于 2017-01-04 17:54:25
回答 2查看 3.5K关注 0票数 11

我想我已经从这些评论中得到了很好的答案,但我会重新表述这个问题,以供将来参考。

我正在尝试使用data.table按组进行求和。问题是,有些组只有才有NA。对于这些团体,我想把这笔钱还回去。但是,如果有一个组的值与NA不同,我想得到非NA值的和。

代码语言:javascript
复制
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。

代码语言:javascript
复制
A[, sum(col2), by = .(col1)]
   col1 V1
1:    A NA
2:    B  5
3:    C NA

但是,添加na.rm = T在组A中返回0,而它应该返回NA。

代码语言:javascript
复制
A[, sum(col2, na.rm = T), by = .(col1)]
   col1 V1
1:    A  0
2:    B  5
3:    C  4

我最喜欢的方法是sandipan在评论中建议的方法,它类似于我在下面编写的函数:

代码语言:javascript
复制
ifelse(all(is.na(col2)), NA, sum(col2, na.rm = T)

我创建了一个函数来绕过它,但我不确定是否有一种已经内置的方式来解决这个问题:

代码语言:javascript
复制
sum.na <- function(df){

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

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

  return(suma)
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-04 23:50:35

根据其他用户的建议,我将发布我的问题的答案。@sandipan在上述评论中提供了解决办法:

正如问题中所指出的,如果您需要对包含NAs的一列的值进行求和,那么有两种很好的方法:

1)使用ifelse:

代码语言:javascript
复制
A[, (ifelse(all(is.na(col2)), col2[NA_integer_], sum(col2, na.rm = T))), 
  by = .(col1)]

2)定义@Frank建议的函数:

代码语言:javascript
复制
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_,因为我一直收到有关类型的错误。

票数 5
EN

Stack Overflow用户

发布于 2019-08-08 03:00:39

使用来自sum_hablar

代码语言:javascript
复制
library(hablar)
A[, as.numeric(sum_(col2)), .(col1)]
#   col1 V1
#1:    A NA
#2:    B  5
#3:    C  4
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41470277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档