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,依此类推。最后每组只有一个“真”。所以“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 回答