这个问题扩展了我昨天问过的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”列是预期的结果。
答案 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)));