Sum/return NA 当所有值都是 NA
Sum/return NA when all values are NA
我正在尝试 运行 具有 NA 观测值的列的函数。当所有观察结果都是 NA 时,我希望它为 return NA,但是当只有一小部分行有它时,只需应用 na.rm=T。我看过一些展示如何执行此操作的帖子 (, link_2, link_3),但其中 none 似乎适用于我的功能,我不确定我哪里出错了。
# data frame
species_1<- c(NA, 10, 40)
species_2<- c(NA, NA, 30)
species_3<- c(NA, NA, NA)
group<- c(1, 1, 1)
df<- data.frame(species_1, species_2, species_3, group)
# function argument
y_true_test<- c(30, 20, 20)
# function
estimate = function(df, y_true, na.rm=T) {
if (all(is.na(df))) df[NA_integer_] else
sqrt(colSums((t(t(df) - y_true_test))^2, na.rm=T) / 3) / y_true_test * 100
}
# run
final<- df %>%
group_by(group) %>%
group_modify( ~ as.data.frame.list(estimate(., y_true_test))) #species 3 returns '0' when it should be NA
如有任何帮助,我们将不胜感激。
该函数正在检查整个数据集列上的 NA
,而不是按每一列检查。这里有一个 across
的选项
library(dplyr)
names(y_true_test) <- grep("species", names(df), value = TRUE)
df %>%
group_by(group) %>%
summarise(across(everything(), ~ if(all(is.na(.x))) NA_real_ else
sqrt(sum((.x - y_true_test)^2, na.rm = TRUE)/n())/
(y_true_test[cur_column()]) * 100), .groups = 'drop')
-输出
# A tibble: 1 × 4
group species_1 species_2 species_3
<dbl> <dbl> <dbl> <dbl>
1 1 43.0 28.9 NA
如果我们想修改OP的功能
estimate <- function(df, y_true, narm=TRUE) {
i1 <- colSums(is.na(df)) == nrow(df)
out <- sqrt(colSums((t(t(df) - y_true_test))^2,
na.rm= narm) / 3) / y_true_test * 100
out[i1] <- NA
out
}
-测试
> df %>%
+ group_by(group) %>%
+ group_modify( ~ as.data.frame.list(estimate(.,
y_true_test)))
# A tibble: 1 × 4
# Groups: group [1]
group species_1 species_2 species_3
<dbl> <dbl> <dbl> <dbl>
1 1 43.0 28.9 NA
我正在尝试 运行 具有 NA 观测值的列的函数。当所有观察结果都是 NA 时,我希望它为 return NA,但是当只有一小部分行有它时,只需应用 na.rm=T。我看过一些展示如何执行此操作的帖子 (
# data frame
species_1<- c(NA, 10, 40)
species_2<- c(NA, NA, 30)
species_3<- c(NA, NA, NA)
group<- c(1, 1, 1)
df<- data.frame(species_1, species_2, species_3, group)
# function argument
y_true_test<- c(30, 20, 20)
# function
estimate = function(df, y_true, na.rm=T) {
if (all(is.na(df))) df[NA_integer_] else
sqrt(colSums((t(t(df) - y_true_test))^2, na.rm=T) / 3) / y_true_test * 100
}
# run
final<- df %>%
group_by(group) %>%
group_modify( ~ as.data.frame.list(estimate(., y_true_test))) #species 3 returns '0' when it should be NA
如有任何帮助,我们将不胜感激。
该函数正在检查整个数据集列上的 NA
,而不是按每一列检查。这里有一个 across
library(dplyr)
names(y_true_test) <- grep("species", names(df), value = TRUE)
df %>%
group_by(group) %>%
summarise(across(everything(), ~ if(all(is.na(.x))) NA_real_ else
sqrt(sum((.x - y_true_test)^2, na.rm = TRUE)/n())/
(y_true_test[cur_column()]) * 100), .groups = 'drop')
-输出
# A tibble: 1 × 4
group species_1 species_2 species_3
<dbl> <dbl> <dbl> <dbl>
1 1 43.0 28.9 NA
如果我们想修改OP的功能
estimate <- function(df, y_true, narm=TRUE) {
i1 <- colSums(is.na(df)) == nrow(df)
out <- sqrt(colSums((t(t(df) - y_true_test))^2,
na.rm= narm) / 3) / y_true_test * 100
out[i1] <- NA
out
}
-测试
> df %>%
+ group_by(group) %>%
+ group_modify( ~ as.data.frame.list(estimate(.,
y_true_test)))
# A tibble: 1 × 4
# Groups: group [1]
group species_1 species_2 species_3
<dbl> <dbl> <dbl> <dbl>
1 1 43.0 28.9 NA