-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 を探します。最後に、各グループには「TRUE」が 1 つだけあります。したがって、「GOAL」列は期待される結果です。

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 ソリューションに似ていますが、ライナーは 1 つです。

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

EDIT最後の最大値を取得します。

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 に答える