计算行仅表示R中具有多个数据点的行

时间:2018-01-15 20:41:02

标签: r missing-data

我正在尝试计算行方法,以便从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

这样只有至少有两个数据点的行才能用于计算均值,而不是将单个数据点作为行的平均值返回。

这是一个复杂的规则,我不确定如何定义它。任何帮助,将不胜感激。 (这是一个有几千行的数据集,所以手动完成它是不可想象的!)

谢谢! 柔

2 个答案:

答案 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