我的数据看起来像
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 :(得分: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