根据值的第一个外观选择组中的一行

时间:2013-03-29 06:50:54

标签: r select

这个问题扩展了我昨天问过的a similar question

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

例如:

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,依此类推。最后,每个组只有一个“TRUE”。所以“GOAL”列是预期的结果。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)。要获得最后一个最大值,您可以执行以下操作:

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

答案 2 :(得分: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)));