如何计算 R 中前 2 个和后 2 个非 NA 的平均值?

How to calculate mean of first 2 and last 2 non-NAs by row in R?

提问人:sdS 提问时间:3/11/2022 更新时间:3/16/2022 访问量:33

问:

我正在计算数据集中某些行为项的分半信度,首先需要获取每个受访者的前 2 个非 NA 值的平均值,然后是每个人(每行)的最后两个非 NA 值。我知道有一些方法可以使用 packages 和 group 的其他方法做到这一点,但我还没有在行中找到解决方案。runnerzoo

为了上下文,我设计了一个调查,其中项目被随机化,以减少项目层面的影响。参与者在调查的某个点看到了特定测量量表中随机项目的 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

任何帮助都是值得赞赏的,谢谢!

r

评论


答:

0赞 jared_mamrot 3/11/2022 #1

这是一个潜在的解决方案:

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 软件包 (v2.0.1) 于 2022-03-11 创建