具有缺失观察值的行算术

时间:2013-02-28 22:30:04

标签: r

我试图按行对数据集执行算术运算,因为缺少观察结果而无法得到我想要的答案。例如,当我使用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

2 个答案:

答案 0 :(得分:3)

您可以在sum来电中使用apply并相应地对每个向量进行加权。

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

答案 1 :(得分:2)

如何用动态替换NAs,如:

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]})