3

たとえば、このデータがある場合:

ID  Value   
1   2
1   2
1   3
1   4
1   10
2   9
2   9
2   12
2   13

そして、私の目標は、各IDサブセットの最小値を見つけることです。その番号を、IDグループの最初の行に入れ、他の行は空白のままにして、次のようにします。

ID  Value   Start
1   2       2
1   2       
1   3       
1   4       
1   10      
2   9       9
2   9       
2   12      
2   13      

私の最初の本能は、を使用してIDのインデックスを作成することです

A <- transform(A, INDEX=ave(ID, ID, FUN=seq_along)) ## A being the name of my data

私は初心者なので、この時点で立ち往生しています。ID = nごとに、そのIDサブセットのmin(A $ Value)を見つけて、ID=nおよびINDEX=1のセル一致条件に配置します。

どんな助けでも大歓迎です!質問を続けてすみません:(

4

4 に答える 4

3

解決策は次のとおりです。

within(A, INDEX <- "is.na<-"(ave(Value, ID, FUN = min), c(FALSE, !diff(ID))))

  ID Value INDEX
1  1     2     2
2  1     2    NA
3  1     3    NA
4  1     4    NA
5  1    10    NA
6  2     9     9
7  2     9    NA
8  2    12    NA
9  2    13    NA

アップデート:

使い方?このコマンドは、の値に沿ったの各サブセットにave(Value, ID, FUN = min)関数を適用します。この例では、5回と4回のベクトルを返します。各サブセットの最初の値を除くすべての値はである必要があるため、関数はで定義された論理インデックスのすべての値を置き換えます。このインデックスは、値が前のインデックスと同じである場合に使用されます。minValueID29NA"is.na<-"c(FALSE, !diff(ID))TRUE

于 2013-02-13T12:20:00.497 に答える
2

もうすぐです。の代わりにカスタム関数を作成し、(ではなく)でseq_along分割valueする必要があります。IDIDID

first_min <- function(x){
  nas <- rep(NA, length(x))
  nas[which.min(x)] <- min(x, na.rm=TRUE)
  nas
}

この関数はNAのベクトルを作成し、最初の要素を最小値の。に置き換えますValue

transform(dat, INDEX=ave(Value, ID, FUN=first_min)) 

##   ID Value INDEX
## 1  1     2     2
## 2  1     2    NA
## 3  1     3    NA
## 4  1     4    NA
## 5  1    10    NA
## 6  2     9     9
## 7  2     9    NA
## 8  2    12    NA
## 9  2    13    NA
于 2013-02-13T12:23:47.667 に答える
1

あなたはタッピーワンライナーでこれを達成することができます

df$Start<-as.vector(unlist(tapply(df$Value,df$ID,FUN = function(x){ return (c(min(x),rep("",length(x)-1)))})))
于 2013-02-13T12:30:09.627 に答える
0

私はこの質問に戻り続けます、そして上記の答えは私を大いに助けました。初心者のための基本的な解決策もあります:

A$Start<-NA A[!duplicated(A$ID),]$Start<-A[!duplicated(A$ID),]$Value

ありがとう。

于 2017-11-20T16:03:46.667 に答える