右 |多列的条件变异

标签 r mean case-when

如果一行中六个观察值中至少有三个是 != NA,我想计算该行的平均值。如果存在四个或更多 NA,则平均值应显示为 NA。

给出平均值的例子,忽略了 NA:

require(dplyr)

a <- 1:10
b <- a+10
c <- a+20
d <- a+30
e <- a+40
f <- a+50

df <- data.frame(a,b,c,d,e,f)

df[2,c(1,3,4,6)] <- NA
df[5,c(1,4,6)] <- NA
df[8,c(1,2,5,6)] <- NA


df <- df %>% mutate(mean = rowMeans(df[,1:6], na.rm=TRUE))

我想到了使用

case_when

但我不确定如何正确使用它:

df <- df %>% mutate(mean = case_when( ~ rowMeans(df[,1:6], na.rm=TRUE), TRUE ~ NA))

最佳答案

您可以尝试一个 base R 解决方案,将非 NA 值的数量保存在一个新变量中,然后使用 ifelse()意思是:

#Data
a <- 1:10
b <- a+10
c <- a+20
d <- a+30
e <- a+40
f <- a+50

df <- data.frame(a,b,c,d,e,f)

df[2,c(1,3,4,6)] <- NA
df[5,c(1,4,6)] <- NA
df[8,c(1,2,5,6)] <- NA
#Code
#Count number of non NA
df$count <- rowSums( !is.na( df [,1:6]))
#Compute mean
df$Mean <- ifelse(df$count>=3,rowMeans(df [,1:6],na.rm=T),NA)

输出:

    a  b  c  d  e  f count     Mean
1   1 11 21 31 41 51     6 26.00000
2  NA 12 NA NA 42 NA     2       NA
3   3 13 23 33 43 53     6 28.00000
4   4 14 24 34 44 54     6 29.00000
5  NA 15 25 NA 45 NA     3 28.33333
6   6 16 26 36 46 56     6 31.00000
7   7 17 27 37 47 57     6 32.00000
8  NA NA 28 38 NA NA     2       NA
9   9 19 29 39 49 59     6 34.00000
10 10 20 30 40 50 60     6 35.00000

关于右 |多列的条件变异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63755059/

相关文章:

r - 如何显示多层图例(geom_point 和 geom_bar)?

r - 如何在 gganimate 包 (R) 中使用多列作为动画的框架?

python - 如何从python中numpy lib的mean方法中删除e科学记数法

hibernate - Hibernate/HQL/JPQL:当……然后NULL否则……END(ClassCastException)时,情况如何?

Oracle新手错误: ORA-00904 Invalid identifier when using "case when"

r - 将 data.frame 列转换为向量

r - 如何避免predict.gam中的 "Error in data[[txt]] : subscript out of bounds"错误?

r - 获取需要匹配 R 中其他列的条件的平均值

python - Pandas:计算平均值,忽略自己行的值

r - 如何在 dplyr 中获取 case_when 接受来自角色的条件