我正在尝试计算行方法,以便从3个评估点创建平均变量。我希望包含具有2个或3个测量点的案例,但不包括那些只有一个测量点的案例。
例如,
> a <- c(1,0,NA,1,NA,0,1,0,NA,0,NA)
> b <- c(1,0,NA,1,0,1,1,1,NA,0,1)
> c <- c(1,NA,NA,0,NA,0,1,1,1,0,0)
> mydata <- data.frame(a,b,c)
> mydata$M <- rowMeans(subset(mydata, select = c(1:3)), na.rm = TRUE)
> mydata$M
当前输出为除1之外的所有行生成一个均值列表,其中包含3个NAs:
[1] 1.00 0.00 NaN 0.66 0.00 0.33 1.00 0.66 1.00 0.00 0.50
但是,我想要的输出是:
[1] 1.00 0.00 NaN 0.66 NaN 0.33 1.00 0.66 NaN 0.00 0.50
这样只有至少有两个数据点的行才能用于计算均值,而不是将单个数据点作为行的平均值返回。
这是一个复杂的规则,我不确定如何定义它。任何帮助,将不胜感激。 (这是一个有几千行的数据集,所以手动完成它是不可想象的!)
谢谢! 柔
答案 0 :(得分:3)
您可以根据某些条件创建一个将均值应用于行的函数。在您的示例中,如果有两个或更多有效测量值,则计算平均值。
a <- c(1,0,NA,1,NA,0,1,0,NA,0,NA)
b <- c(1,0,NA,1,0,1,1,1,NA,0,1)
c <- c(1,NA,NA,0,NA,0,1,1,1,0,0)
mydata <- data.frame(a,b,c)
阅读功能最好从里到外完成。这个将采用向量x
并查看有多少不 NA。当它总和(sum
)TRUE / FALSE值时,它们分别将它们预先变为1和0。然后,如果有超过1个(因此2个或更多)值,则执行测试 - 不是NA。
conditionalMean <- function(x) {
if (sum(!is.na(x)) > 1) {
mean(x, na.rm = TRUE)
} else {
NA
}
}
我们将此功能应用于您的data.frame
行,如MARGIN = 1
所示。如果你有一个按列工作的函数,你可以使用MARGIN = 2
。你可以尝试一下。比较apply(mydata, MARGIN = 2, FUN = mean, na.rm = TRUE)
和colMeans(mydata, na.rm = TRUE)
。
apply(mydata, MARGIN = 1, FUN = conditionalMean)
[1] 1.0000000 0.0000000 NA 0.6666667 NA 0.3333333 1.0000000
[8] 0.6666667 NA 0.0000000 0.5000000
答案 1 :(得分:1)
您可以使用dplyr
尝试类似的内容:
library(dplyr)
mydata %>%
mutate(row_mean = ifelse((is.na(a)+is.na(b)+is.na(c)) %in% 2:3, NaN,
rowMeans(.[1:3], na.rm = TRUE)))
<强>结果:强>
a b c row_mean
1 1 1 1 1.0000000
2 0 0 NA 0.0000000
3 NA NA NA NaN
4 1 1 0 0.6666667
5 NA 0 NA NaN
6 0 1 0 0.3333333
7 1 1 1 1.0000000
8 0 1 1 0.6666667
9 NA NA 1 NaN
10 0 0 0 0.0000000
11 NA 1 0 0.5000000