2016-04-04 1 views
0

プレーヤーA、B、C、D、E、Fがあり、データフレームDが各行にプレーヤーラベルがあり、複数の行があります。すべてのプレイヤーが順番に最初の観測を見つけるための効率的な方法R

明らかにD:length(unique(D$names))で指定されたチームの一意の数が獲得されるインデックスを探したいと思います。

たとえば、最初の6行にA、B、C、D、E、Fという名前があるとします。この場合、インデックス= 6です。ただし、A、B、C、 D、A、E、Fの場合、インデックス= 7となります。私はこのため、6時開始*行の最小数は

を必要とする、私はR.で一致機能を使用して、より良い解決策があると思い

for(i in 6:60){ 

    if (length(unique(D$Team[1:i]))==length(unique(D$Team))) 
    { 
    print(i) 
    break 
    } 
} 

:私はfollwong 不格好コードをやりました

match(length(unique(D$Team)[i]),length(unique(D$Team))) 
+1

てみ 'MAX(マッチ(ユニーク(D $チーム)、D $チーム))' – nicola

答えて

2

matchは、ベクトルの要素の最初の発生を与えますので、あなたはすべてのユニークな要素の最初の試合の位置を検索し、最大とることができます。例として

max(match(unique(D$Team),D$Team)) 

を:

set.seed(1) 
D<-data.frame(Team=sample(LETTERS[1:6],100,TRUE),stringsAsFactors=FALSE) 
max(match(unique(D$Team),D$Team)) 
#[1] 13 
D$Team[1:13] 
#[1] "B" "C" "D" "F" "B" "F" "F" "D" "D" "A" "B" "B" "E" 
+0

おかげで、脇に小さなとして、ために必要な出現箇所の数を見つけるために、このアプローチを使用することはできません各チームは2つをプレーする何回かではなく、何回ですか? – dimebucker91

2

「のようなもの私たちはあなたのベクトルの非重複要素のインデックスを取得するためにseq_along()を使用して、内全体を包むことにより、最後の要素のインデックスを達成することができ。

# Example vector based on your question 
vec <- c("A","B","C","D","A","E","F") 

# Get index of last non-duplicate element 
max(seq_along(vec)[!duplicated(vec)]) 
#[1] 7 
関連する問題