0

私のデータは次のようになります

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

AとBの両方がNAでない場合にのみ、各位置のAとBのパーセンテージ差を計算しようとしました。

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  

どんなアイデアでも大歓迎です。ありがとう!

4

1 に答える 1

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
于 2017-10-13T11:09:02.720 に答える