2016-09-22 9 views
2

の値に応じて、私はこのR割り当て値別の列

NAME  DIST  
A   0   
A   1   
A   100   
A   2   
A   1   
A   4   
A   500   
A   1   
A   1   

のようなデータフレームを持っている私は何をしたい、そのような場合DISTその新しい列NEWNAMEを作成するための効率的な方法を見つけることです> 100は、それは私がforループを使用してそれを行っているが、私はRのスタイルで、より効率的なソリューションを探していました

NAME  DIST  NEWNAME 
A   0   A 
A   1   A 
A   100   A 
A   2   A2 
A   1   A2 
A   4   A2 
A   500   A3 
A   1   A3 
A   1   A3 

以前のすべての行に対して同じであるAAの名前が含まれています。私のコードの下にはあなたがあなたの新しい列を作成するには、この操作を行うことができ、事前

+0

四番目は 'A2'ですか? – nicola

+0

行3の新しい名前はAだが、行7の場合はA3だと説明できますか? – Roland

+0

長さ> 3の記述に従って、A、A2、A3をペーストする必要があります。 –

答えて

1

のループのための

k <- 0 
for(l in 1:length(df$NAME)){ 
     if(df$DIST[l] >= 100){ 
       k <- k+1; 
       df$NEWNAME[(l):length(df$NAME)] <- paste(df$NAME,k,sep="") 
     } 
    } 

感謝を使って:

df$NEWNAME=paste0("A", cumsum(0+df$DIST>=100)) 

私はdfとして、あなたのデータを使用しても、あなたは優れた意味と仮定しましたまたはそれと同等から100:

EDIT

あなたは> 100距離の行N + 1の新しい名前を開始する必要がある場合は、あなたが後にこれを行うことができます:第三の要素は `A`とあるのはなぜ

df$NEWNAME2 = lag(df$NEWNAME, n=1, default="A0") 
#### NAME DIST NEWNAME NEWNAME2 
#### 1 A 0  A0  A0 
#### 2 A 1  A0  A0 
#### 3 A 100  A1  A0 
#### 4 A 2  A1  A1 
#### 5 A 1  A1  A1 
+0

'cumsum()'ステートメントの '0 +'はなぜですか? – niczky12

+0

TRUE/FALSEベクトルを0/1に変換するのは単なるトリックです。実際には、cumsumが自動的に論理を数値に強制するので、ここでは必要でもありません。 – agenis

+0

ありがとうございます。別の列に基づいて、別の制約を追加したい場合はどうすればよいですか? – user3910073

関連する問題