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