按行和总和列值过滤

时间:2017-10-13 07:17:05

标签: r dplyr plyr rowsum

我的数据看起来像

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  

任何想法都将不胜感激。谢谢!

1 个答案:

答案 0 :(得分: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
相关问题