dplyr R 中汇总函数中的 ifelse() 嵌套语句

ifelse() nested statements in summarize function in dplyr R

我正在尝试根据按标签列分组来总结数据框。我想根据以下条件获得手段: - 如果所有数字都是 NA - 那么我想 return NA - 如果所有数字的平均值为 1 或更低 - 我想 return 1 - 如果所有数字的平均值高于 1 - 我想要组中大于 1 的值的平均值 - 其余的应该是 100.

设法找到答案,现在我的代码是 运行 好吧 - is.na() 应该在第一个 ifelse() 语句中而不是 ==NA,那是问题。

label <- c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7)
sev <- c(NA,NA,NA,NA,1,0,1,1,1,NA,1,2,2,4,5,1,0,1,1,4,5)
Data2 <- data.frame(label,sev)

d <- Data2 %>%
        group_by(label) %>%
        summarize(sevmean = ifelse(is.na(mean(sev,na.rm=TRUE)),NA,
                                 ifelse(mean(sev,na.rm=TRUE)<=1,1,
                                        ifelse(mean(sev,na.rm=TRUE)>1,
                                               mean(sev[sev>1],na.rm=TRUE),100))))

你的第一个条件就是这里的问题。如果我们删除嵌套的 ifelse 并只保留第一个,我们会得到相同的输出

Data2 %>%
   group_by(label) %>%
   summarise(sevmean = ifelse(mean(sev,na.rm=TRUE)==NaN,NA,1))

#  label sevmean
#  <dbl> <lgl>  
#1  1.00 NA     
#2  2.00 NA     
#3  3.00 NA     
#4  4.00 NA     
#5  5.00 NA     
#6  6.00 NA     
#7  7.00 NA     

我不确定您为什么要检查 NaN,但如果您想这样做,请使用 is.nan 而不是 ==

检查
Data2 %>%
  group_by(label) %>%
   summarize(sevmean = ifelse(is.nan(mean(sev,na.rm=TRUE)),NA,
                         ifelse(mean(sev,na.rm=TRUE)<=1,1,
                                ifelse(mean(sev,na.rm=TRUE)>1,
                                       mean(sev[sev>1],na.rm=TRUE),100))))


#  label sevmean
#  <dbl>   <dbl>
#1  1.00    NA   
#2  2.00    1.00
#3  3.00    1.00
#4  4.00    2.00
#5  5.00    3.67
#6  6.00    1.00
#7  7.00    4.50