我对R非常陌生。我在调查表中有多列变量与不同的问题答案相关。我希望在数据框中生成一个新列,该列是上述所有变量的平均值。我已经看到rowMeans可以用于此目的,但这似乎仅适用于相邻列,但我要平均的列不相邻。我还希望对如何处理丢失的数据进行一些控制。我使用
创建了示例数据Var1<- c(1.5, 2.3, NA, NA, 2.3, 3.3)
Var2<- c(1.7, 2.2, 4.7, 13.3, 1.7, 1.5)
Var3<- c(5.1, 6.7, 3.4, 5.5, NA, 8.7)
Var4<- c(4.5, 5.4, NA, 4.5, 5.4, 8.9)
哪个给
Var1 Var2 Var3 Var4
1 1.5 1.7 5.1 4.5
2 2.3 2.2 6.7 5.4
3 NA 4.7 3.4 NA
4 NA 13.3 5.5 4.5
5 2.3 1.7 NA 5.4
6 3.3 1.5 8.7 8.9
因此,我想在此数据框中创建一个新列或变量,该变量或变量是Var1,Var2和Var4(而不是Var3)的平均值。如果缺少其中一个变量的数据,我还希望它仍然产生剩余数据的平均值,但是如果其中两列的数据丢失,我希望它在新列中返回NA。因此,对于第3个人,新列将为NA,但对于第4个人和第5个人,将产生这三列中可用值的平均值。
我希望这是有道理的,对我们的帮助非常感谢
答案 0 :(得分:2)
我们可以通过子集数据集,使用rowSums
检查所选列的NA
数。如果大于1,则返回NA,否则返回1。然后,用rowMeans
获得所选列的mean
行,并将NA大于1的行更改为NA >
# column index
ind <- c(1, 2, 4)
i1 <- NA^(rowSums(is.na(df1[ind])) > 1)
df1$newCol <- rowMeans(df1[ind], na.rm = TRUE) * i1
df1 <- data.frame(Var1, Var2, Var3, Var4)
答案 1 :(得分:1)
给..
df1 <- data.frame(Var1, Var2, Var3, Var4)
一个解决方案是..
df1$newCol <- apply(df1[,-3],1,function(x){ifelse(sum(is.na(x))>1,NA,mean(x,na.rm=T))})