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
我正在尝试根据按标签列分组来总结数据框。我想根据以下条件获得手段:
- 如果所有数字都是 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