2017-04-04 8 views
0

を追加し、私は、次のコードを持っているし、出力が100%正しくないように私はそれを調整する必要があります。グループの行と新しい列

df = read.table(text='colA colB colC 
       10 11 7 
       10 34 7 
       10 89 7 
       10 21 7 
       9 8 0 
       9 11 0 
       9 21 0 
       2 23 5 
       2 21 5 
       2 56 5 
       1 45 0 
       1 23 0 
       22 14 3 
       22 19 3 
       22 90 3 
       11 19 2 
       11 45 2 
       80 13 2 
       80 17 2 
       99 15 1 
       55 20 1', header = TRUE) 

df$ID <-NA 

df[1,'ID']<-1 

val=1 

for (i in 2:nrow(df)){ 

    if (df[i,'colC']!=0 & (df[i,'colC']!=df[i-1,'colC'])) {val=val+1} 
    df[i,'ID']<-val 

} 

出力コード上記の通り:間違って何

> df 
    colA colB colC ID 
1 10 11 7 1 
2 10 34 7 1 
3 10 89 7 1 
4 10 21 7 1 
5  9 8 0 1 
6  9 11 0 1 
7  9 21 0 1 
8  2 23 5 2 
9  2 21 5 2 
10 2 56 5 2 
11 1 45 0 2 
12 1 23 0 2 
13 22 14 3 3 
14 22 19 3 3 
15 22 90 3 3 
16 11 19 2 4 
17 11 45 2 4 
18 80 13 2 4 
19 80 17 2 4 
20 99 15 1 5 
21 55 20 1 5 

グループ行がcolCに基づくべきであるが、それぞれ異なるグループの間には0が存在しないので、同じ番号が、多様colAcolC値がtogethグループ化されている最後の4つのID値でありますこれは私が望むものではありません。

所望の出力(最後の4つのID値を参照してください):

> df 
    colA colB colC ID 
1 10 11 7 1 
2 10 34 7 1 
3 10 89 7 1 
4 10 21 7 1 
5  9 8 0 1 
6  9 11 0 1 
7  9 21 0 1 
8  2 23 5 2 
9  2 21 5 2 
10 2 56 5 2 
11 1 45 0 2 
12 1 23 0 2 
13 22 14 3 3 
14 22 19 3 3 
15 22 90 3 3 
16 11 19 2 4 
17 11 45 2 4 
18 80 13 2 5 
19 80 17 2 5 
20 99 15 1 6 
21 55 20 1 7 

どのように私はこの問題を解決することができますか?

答えて

0

異なるcolA値は新しいIDが、条件に含まれるcolAニーズ作るので、あなたは、あなたの条件を少し変更する必要があります。

for (i in 2:nrow(df)){ 
    # check the difference of colA here 
    if (df[i,'colC']!=0 & (df[i,'colA']!=df[i-1,'colA'])) {val=val+1} 
    df[i,'ID']<-val  
} 

df$ID 
# [1] 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 4 5 5 6 7 

をそれとも、としてそれをベクトル化することができます

df$ID <- with(df, cumsum(c(TRUE, diff(colA) != 0 & colC[-1] != 0))) 
df$ID 
# [1] 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 4 5 5 6 7 
+0

神、または彼の力を持っている人があなたを祝福するかもしれません。ありがとうございました – aaaaa

+1

よろしくお願いします。神はあなたと幸運を祝福! – Psidom

+0

私は上記のコードに苦労していた週でした。ありがとうございました。 – aaaaa

関連する問題