我想我已经从这些评论中得到了很好的答案,但我会重新表述这个问题,以供将来参考。
我正在尝试使用data.table按组进行求和。问题是,有些组只有才有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在组A中返回0,而它应该返回NA。
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)
}发布于 2017-01-04 23:50:35
根据其他用户的建议,我将发布我的问题的答案。@sandipan在上述评论中提供了解决办法:
正如问题中所指出的,如果您需要对包含NAs的一列的值进行求和,那么有两种很好的方法:
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_,因为我一直收到有关类型的错误。
发布于 2019-08-08 03:00:39
使用来自sum_的hablar
library(hablar)
A[, as.numeric(sum_(col2)), .(col1)]
# col1 V1
#1: A NA
#2: B 5
#3: C 4https://stackoverflow.com/questions/41470277
复制相似问题