gpt4 book ai didi

r - 如果所有值都是 NA,则计算总和或返回 NA 的有效方法

转载 作者:行者123 更新时间:2023-12-01 22:56:56 26 4
gpt4 key购买 nike

在模拟过程中,我创建了多个具有 > 1,000,000 个变量的数据集。但是,这些变量的一些值是 NA在某些情况下,甚至所有值都是 NA .现在我想计算所有变量值的总和,但想得到 NA如果所有值都是 NA .

常见问题sum(x, na.rm=T)sum(na.omit(x))也就是说,如果所有值都是 NA,则返回 0 .因此,我编写了自己的函数来处理 NA以预期的方式:

sumna <- function(x) {
sumna <- NULL
return(ifelse(all(is.na(x)), NA, sum(na.omit(x))))
}

但是,该实现相当缓慢。

因此,我正在寻找一个实现或预先实现的函数来总结向量的值,省略 NA并返回 NA如果所有值都是 NA .

提前谢谢了!

最佳答案

sum_来自 hablar具有与 OP 想要的相同行为。所以,无需重新发明轮子

library(hablar)
sum_(c(1:10, NA))
#[1] 55
sum_(c(NA, NA, NA))
#[1] NA

它可以在 tidyverse 中使用或 data.table
library(dplyr)
df1 %>%
summarise_all(sum_)

但是,如果我们需要更改 OP 的自定义函数,而不是 ifelse ,更好的选择是 if/else
sumna <- function(x) {
if(all(is.na(x))) NA else sum(x, na.rm = TRUE)
}

此外,我们可以使用矢量化 colSums
v1 <- colSums(df1, na.rm = TRUE)
v1[colSums(is.na(df1)) == nrow(df1)] <- NA

由于数据集很大,我们也可以利用高效的 data.table
library(data.table)
setDT(df1)[, lapply(.SD, sumna)]

或使用 tidyverse
library(tidyverse)
df1 %>%
summarise_all(sumna)

关于r - 如果所有值都是 NA,则计算总和或返回 NA 的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56473098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com