簡體   English   中英

當所有值都為 NA 時求和/返回 NA

[英]Sum/return NA when all values are NA

我正在嘗試在具有 NA 觀察值的列上運行 function。 當所有觀察結果都是 NA 時,我希望它返回 NA,但是當只有一小部分行有它時,只需應用 na.rm=T。 我看過一些展示如何執行此操作的帖子( link_1link_2link_3 ),但它們似乎都不適用於我的 function,而且我不確定我哪里出錯了。

# 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

任何幫助將不勝感激。

function 正在檢查整個數據集列的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的function

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM