-2

这个问题扩展了我昨天问的一个类似问题。

我想在第一次出现定义数字的组内找到行。如果该数字未出现在组中,则将使用下一个最高数字。

例如:

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)
GOAL <- c("FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE")
data <- data.frame(group, value, GOAL)
data

首先,我想在组中搜索值 3。如果存在,组中第一个数字 3 的行被标记为“TRUE”,如果不是,则查找第一个值 2,依此类推。最后每组只有一个“真”。所以“目标”列是预期的结果。

4

3 回答 3

2

which(v==2)[1]您可以通过将我对您最后一个问题的答案替换为 来获得您描述的结果which.max(v)

f <- function(v) replace(logical(length(v)), which.max(v), TRUE)
transform(data, 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  TRUE
# 11     c     3 FALSE
# 12     c     2 FALSE
于 2013-03-29T07:55:37.810 回答
2

或在基本包中,类似于@MatthewPlourde 解决方案,但只有一个衬里:

transform(data, GOAL= ave(value,group,
        FUN=function(x)seq(x)==which.max(x))> 0)

编辑获得最后一个最大值。

which.max确定第一个最大值的位置。它相当于head(which(x == max(x)),1)。要获得 The last maximum ,您可以执行以下操作:

transform(data, GOAL= ave(value,group,
                          FUN=function(x)seq(x)==tail(which(x==max(x)),1))> 0)
于 2013-03-29T08:07:18.313 回答
1

试试这个代码片段:

 groups<-c("a", "a", "a", "a", "b", "b", "b", "b", "c", "c", "c", "c");
 values<-c(1, 3, 2, 1, 1, 1, 2, 1, 2, 3, 3, 2);
 dFrame<-data.frame(groups,values);

 max_values<-as.vector(unlist(tapply(dFrame$values,dFrame$groups,max)));
 length_values<-as.vector(unlist(tapply(dFrame$values,dFrame$groups,length)));

 dFrame$GOAL<-as.vector(unlist(sapply(1:length(max_values),FUN=function(i,x,y,z){
   v<-rep(FALSE,z[i]);
   ind<-match(y[i],as.vector(unlist(x[i])));
   v[ind]<-TRUE;
   return (v);
   },x=tapply(dFrame$values,dFrame$groups,identity),
   y=max_values,z=length_values)));
于 2013-03-29T08:07:05.967 回答