2017-10-13 6 views
0

Mes données ressembleAffiner par des rangées et des colonnes de valeurs de somme

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

I essayé de calculer la différence en pourcentage entre A et B pour chaque pos uniquement lorsque A et B ne sont pas 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),"")) 

Ainsi, les résultats devraient être

pos diff 
1 0.5 
2 NA 

je ne fais pas partie qui est mal, mais mon code produit

pos diff 
1 0.5 
1  
2  
2 

Toutes les idées seraient appréciées. Merci!

+0

Est-ce ce que vous voulez ' 'd%>% Filtre ((is.na (A) et is.na (B)!))%>% group_by (pos)%>% muté (A1 = somme (A, na.rm = T), A2 = somme (B, na.rm = T))%>% mute (Dif = A1-A2, res = Dif/A1) ' – Jimbou

+0

Salut. Merci pour la partie filtre. Mais la fonction rowsum fonctionne bien pour mon cas. –

Répondre

0

pas le code le plus élégant, mais il semble fonctionner:

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