4

以前も同じような質問をしましたが、今はその逆に変更しますか? 定義された番号が最後に表示されるグループ内の行を検索したいのですが、この番号がグループに表示されない場合は、次に高い番号が使用されます。

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

group <- c("a", "a", "a", "a", "b", "b", "b", "b", "c", "c", "c", "c")
value <- c(1, 3, 2, 1, 1, 1, 2, 1, 2, 3, 3, 2)
dat <- data.frame(group, value)
dat

まず、グループの値が 3 であるかどうかを検索したいと思います。そうであれば、グループ内の最後の番号 3 の行は「TRUE」としてマークされます。グループ内に番号 3 がない場合は、最初の番号 2 を探します。最後に、各グループには「TRUE」が 1 つだけあります。したがって、「RESULT」列は私の質問の結果になるはずです。今回は質問がより理解できることを願っています。よろしくお願いします。

期待される結果:

 group <- c("a", "a", "a", "a", "b", "b", "b", "b", "c", "c", "c", "c")
 value <- c(1, 3, 3, 1, 1, 1, 2, 1, 2, 3, 3, 2)
 RESULT <- c("FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "TRUE", "FALSE")
 target <- data.frame(group, value, RESULT)
 target
4

2 に答える 2

4

どうぞ。

f <- function(v) replace(logical(length(v)), 
                         which(v == max(v) & !duplicated(v, fromLast=TRUE)), 
                         TRUE)
transform(dat, GOAL=as.logical(ave(value, group, FUN=f)))
#    group value  GOAL
# 1      a     1 FALSE
# 2      a     3  TRUE
# 3      a     2 FALSE
# 4      a     1 FALSE
# 5      b     1 FALSE
# 6      b     1 FALSE
# 7      b     2  TRUE
# 8      b     1 FALSE
# 9      c     2 FALSE
# 10     c     3 FALSE
# 11     c     3  TRUE
# 12     c     2 FALSE
于 2013-03-29T17:45:35.197 に答える
3

私はするだろう:

is.first.max <- function(x) seq_along(x) == which.max(x)
is.last.max  <- function(x) rev(is.first.max(rev(x)))
transform(dat, RESULT = as.logical(ave(value, group, FUN = is.last.max)))
于 2013-03-29T17:56:20.270 に答える