2013-02-28 72 views
0

我試圖按行對數據集執行算術運算,但由於缺少觀察值而無法得到我想要的答案。例如,當我使用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 

回答

3

你可以只在一個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 
2

如何在飛行中以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