[英]How to calculate mean of first 2 and last 2 non-NAs by row in R?
我正在计算数据集中某些行为项目的分半可靠性,首先需要获取每个受访者前 2 个非 NA 值的平均值,然后是每个人(每行)的最后两个非 NA 值。 我知道有一些方法可以按列使用包runner
、 zoo
和其他包来做到这一点,但我还没有找到行内的解决方案。
对于上下文,我设计了一项调查,其中项目是随机的,以减少项目级的影响。 参与者在调查的一个点看到了来自特定测量量表的随机项目子集的 1/2,在不同的点看到了另外 1/2。 因此,在每个两个时间点,每个参与者的非 NA 数量都将与 NA 相同。
例如,假设我总共有 8 件物品。 第 1 个人、第 2 个人和第 3 个人在时间点 1 的数据如下:
x1 x2 x3 x4 x5 x6 x7 x8
1 NA NA 2 NA 1 1 NA
NA 4 3 3 NA NA 4 NA
3 2 1 NA NA NA 3 NA
生成的新变量(avg1 和 avg2)应为:
x1 x2 x3 x4 x5 x6 x7 x8 avg1 avg2
1 NA NA 2 NA 1 1 NA 1.5 1
NA 4 3 3 NA NA 4 NA 3.5 3.5
3 2 1 NA NA NA 3 NA 2.5 2
感谢任何帮助,谢谢!
这是一种可能的解决方案:
m <- as.matrix(read.table(text = "x1 x2 x3 x4 x5 x6 x7 x8
1 NA NA 2 NA 1 1 NA
NA 4 3 3 NA NA 4 NA
3 2 1 NA NA NA 3 NA ",
header = TRUE))
# Only keep non-NA values
m2 <- t(apply(m,1,function(x) c(x[!is.na(x)])))
# Select the first two non-NA values
m3 <- m2[,1:2]
# Select the second-last and last non-NA values
m4 <- m2[,(ncol(m2)-1):(ncol(m2))]
# Bind the matrix to the mean of the first two and the mean of the last two non-NA values
cbind(m, "avg1" = rowMeans(m3), "avg2" = rowMeans(m4))
#> x1 x2 x3 x4 x5 x6 x7 x8 avg1 avg2
#> [1,] 1 NA NA 2 NA 1 1 NA 1.5 1.0
#> [2,] NA 4 3 3 NA NA 4 NA 3.5 3.5
#> [3,] 3 2 1 NA NA NA 3 NA 2.5 2.0
由reprex package (v2.0.1) 创建于 2022-03-11
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.