我正在尝试根据按标签列分组来总结一个数据框。我想根据以下条件获得收入:
-如果所有数字均为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))))
答案 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