【问题标题】:ifelse() nested statements in summarize function in dplyr Rdplyr R中汇总函数中的ifelse()嵌套语句
【发布时间】:2018-07-13 09:06:20
【问题描述】:

我正在尝试根据标签列分组来总结数据框。我想根据以下条件获得手段: - 如果所有数字都是NA - 那么我想返回NA - 如果所有数字的平均值为 1 或更低 - 我想返回 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))))

【问题讨论】:

  • 可能case_when() 是您所寻找的。​​span>
  • 从未见过此功能。在为此苦苦挣扎后,终于自己找到了问题所在。第一个 ifelse() 语句中的 is.na() 而不是 ==NA 就是答案
  • 谢谢@RiccardoLavelli,无论如何我都会查找它以学习新的东西并且可能非常有用!
  • 如果您找到解决方案,请将其作为答案发布,它可能对其他人也有帮助。
  • @MIH:要了解为什么会这样,请查看此链接:stats.stackexchange.com/questions/5686/…

标签: r if-statement nested dplyr summarize


【解决方案1】:

您的第一个条件就是这里的问题。如果我们删除嵌套的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

【讨论】:

    猜你喜欢
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多