按行计算丢失的观察值

问题描述:

我试图按行对数据集执行算术运算,但由于缺少观察值而无法得到我想要的答案。例如,当我使用apply时,我获得了缺少的观察结果。最终,我通过使用rowSums得到所需的答案,首先将某些列乘以-1(而不是减去它们)。我也使用循环获得了期望的答案。下面显示了这三种方法和另一种方法。按行计算丢失的观察值

是否有可能通过apply获得所需的答案?有一种更简单的方式,我忽略了吗?我的问题类似于这个:Handling missing/incomplete data in R--is there function to mask but not remove NAs?有一个答案建议看动物园包,虽然我真的更喜欢基地R.感谢您的任何建议。这似乎是一个基本问题。对不起,如果我忽略了一个明显的解(我只注意到有缺失的观测没有标签。)

df.1 <- read.table(text=' 
AA BB CC DD EE FF GG HH II JJ 
100 2 3 4 5 6 7 8 9 10 
200 12 13 14 15 16 17 18 19 20 
300 NA 23 24 25 26 NA 28 29 30 
400 32 33 34 35 36 37 38 NA 40 
500 42 43 44 45 46 47 48 49 50 
', header=T, na.strings = "NA") 

# this does not work 

apply(df.1[,c("AA","BB", "CC", "DD", "FF", "GG", "II", "JJ")], 1, 
      function(x) {x[1] - (x[2] + x[3] + x[4]) - (x[5] + x[6] + x[7]) + x[8]}) 

# [1] 79 129 NA NA 279 

df.2 <- data.frame(df.1$AA, df.1$BB, df.1$CC, df.1$DD, df.1$FF, df.1$GG, df.1$II, df.1$JJ) 
colnames(df.2) <- c('AA', 'BB', 'CC', 'DD', 'FF', 'GG', 'II', 'JJ') 

# this does not work 

df.2$AA - (df.2$BB + df.2$CC + df.2$DD) - (df.2$FF + df.2$GG + df.2$II) + df.2$JJ 
# [1] 79 129 NA NA 279 

# this works 

df.3 <- data.frame(df.2$AA, -1 * df.2$BB, -1 * df.2$CC, -1 * df.2$DD, -1 * df.2$FF, -1 * df.2$GG, -1 * df.2$II, df.2$JJ) 

rowSums(df.3, na.rm = TRUE) 
# [1] 79 129 228 268 279 

# this works 

my.sum <- rep(NA, nrow(df.2)) 

for (i in 1:nrow(df.2)) { 
    my.sum[i] <- sum(df.2$AA[i], -1 * df.2$BB[i], -1 * df.2$CC[i], -1 * df.2$DD[i], -1 * df.2$FF[i], -1 * df.2$GG[i], -1 * df.2$II[i], df.2$JJ[i], na.rm = TRUE) 
} 

my.sum 
# [1] 79 129 228 268 279 

你可以只在一个apply通话和重量使用sum每个矢量相应地。

weights <- c(1,rep(-1,3),0,rep(-1,2),0,-1,1) 

apply(df.1,1,function(x) sum(x*weights,na.rm=T)) 
[1] 79 129 228 268 279 

虽然这也许是更快的转置矩阵乘以这些权重使用colSums

colSums(t(df.1)*weights,na.rm=T) 
[1] 79 129 228 268 279 

如何在飞行中以0代替来港,如:

apply(df.1[,c("AA","BB", "CC", "DD", "FF", "GG", "II", "JJ")], 1, 
      function(x) {x[is.na(x)]=0; x[1] - (x[2] + x[3] + x[4]) - (x[5] + x[6] + x[7]) + x[8]}) 
+2

只要确保算术不涉及乘除! ;) – joran 2013-02-28 22:39:50

+0

这个答案看起来应该是对应的复选标记,但我不能同时给它们。 – 2013-03-06 00:29:10