2017-10-13 69 views
0

我的數據看起來像過濾器的行和列總和值

pos year A B 
1 2012 1 1 
1 2013 1 NA 
2 2012 NA NA 
2 2013 NA 1 

我試圖計算每個POS A和B之間的百分比差異,只有當A和B都不NA。

ddply(x, .(pos), summarize, diff = ifelse(is.na(A)==FALSE & is.na(B)==FALSE, 
             (rowsum(A, pos, na.rm=TRUE)-rowsum(B, pos, na.rm=TRUE))/rowsum(A, pos, na.rm=TRUE),"")) 

所以結果應該是

pos diff 
1 0.5 
2 NA 

我沒有哪一部分是錯誤的,但我的代碼產生

pos diff 
1 0.5 
1  
2  
2 

任何想法,將不勝感激。謝謝!

+0

這是你想要''d%>% 濾波器((is.na(A)is.na(B)什麼! )%>% group_by(pos)%>% mutate(A1 = sum(A,na.rm = T),A2 = sum(B,na.rm = T))%> 變異A1-A2, res = Dif/A1)' – Jimbou

+0

嗨。感謝您的過濾器部分。但是rowsum函數對我的情況非常適用。 –

回答

0

不是最優雅的代碼,但它似乎工作:

df <- data.frame(pos = rep(1:2, each = 2), year = rep(2012:2013, 2), 
       A = rep(c(1, NA), each = 2), B = c(1, NA, NA, 1)) 

foo <- function(x) ifelse(
    all(is.na(x[[1]])) | all(is.na(x[[2]])), 
    NA, (sum(x[[1]], na.rm = T) - sum(x[[2]], na.rm = T))/nrow(x)) 
x <- by(df[ , 3:4], df$pos, foo) 
data.frame(pos = unique(df$pos), diff = as.vector(x)) 

    pos diff 
    1 0.5 
    2 NA