2017-05-21 11 views
0

私はRプログラミングの初心者です(私の生涯のSASでプログラミングされています)、答えを見つけることができなかった基本的な質問です(これに似た質問への回答が見つかりましたが、この回答はありません)。R値のクラスターにIDを割り当てるR

0または1の値を持つことができるバイナリ変数(「v1」と呼ぶ)があるとします。新しい変数(「v2」と呼ぶ)を作成したい一意のクラスタIDの値にするたびに1が表示されますまたは1の文字列の新しい値が最終的に0にした後に表示され、次のように、私はV1から「V2」を作成したいと思います:

Obs v1 v2 
1 0 NA 
2 0 NA 
3 1 1 
4 1 1 
5 0 NA 
6 1 2 
7 0 NA 
8 1 3 
9 1 3 
10 1 3 
11 0 NA 
12 1 4 

誰か場合このことについていくつかの光を当てることができた、私は非常に感謝します。どうもありがとう。

答えて

6

これはトリックを行います。グループを、v1の値に増加数の累積合計と1を掛けたものに等しく設定し、次に0をNAに戻します。だから、与えられたv1ため

df$v2 <- cumsum(c(df$v1[1]==1,diff(df$v1)==1)) 
df$v2[df$v1==0] <- NA 
+2

がV1の最初の要素は1 – Lamia

+0

であれば、問題があるようです生み出すはい - 申し訳ありません - 上記で改正された。 –

+0

このテーマのバリエーション - 'as.numeric(factor(replace(cumsum(!df $ v1)、!df $ v1、NA))))' – thelatemail

1

v1<-c(0,0,1,1,0,1,0,1,1,1,0,1) 
v1_sum <- unlist(lapply(seq_along(1:length(v1)),function(x) sum(v1[1:x])))#create the cumulative sum per index 
v1_sum[v1==0] <- NA#imputing NA values to v1_sum when v1 is 0 
v1_sum_new_vals <- unlist(lapply(seq_along(1:length(v1_sum)),function(x) {sum(is.na(v1_sum[1:x]))-1}))#cumulative sum of NA's per index 
v2 <- ifelse(!is.na(v1_sum),v1_sum_new_vals,v1_sum)#imputing new values based on a condition 

すべて一緒に入れては

df<-data.frame(v1,v2) 
df 
v1 v2 
1 0 NA 
2 0 NA 
3 1 1 
4 1 1 
5 0 NA 
6 1 2 
7 0 NA 
8 1 3 
9 1 3 
10 1 3 
11 0 NA 
12 1 4 
+0

ありがとう! – user8045187

関連する問題