0

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

是否有可能获得所需的答案apply?有没有更简单的方法可以让我忽略?我的问题与此类似:Handling missing/incomplete data in R-is there function to mask but not remove NAs? 那里的一个答案建议查看 zoo 包,尽管我真的更喜欢 base 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
4

2 回答 2

3

您可以sumapply调用中使用并相应地加权每个向量。

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
于 2013-02-28T23:16:22.750 回答
2

如何在运行中用 0 替换 NA,例如:

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]})
于 2013-02-28T22:38:52.393 回答