ifelse()在dplyr R

时间:2018-07-13 09:06:20

标签: r if-statement nested dplyr summarize

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

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

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))))

1 个答案:

答案 0 :(得分:2)

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