2017-05-21 20 views
0

我是新與R編程(在SAS我的整個生活被編程),我有什麼,我認爲是一個基本的問題,我一直沒能找到答案(找到類似問題的答案,但沒有找到答案)。假設我們有一個二進制變量(我們稱之爲「v1」),其值可以是0或1.我想創建一個新的變量(我們稱之爲「v2」),它需要上唯一的集羣ID的每一個0後,最終出現1的新值或1串出現時間的價值,我想從第一版如下創建「V2」:分配一個ID列值的集羣中的R

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。

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(!因子(更換(cumsum(DF $ V1),DF $ V1,NA))!)' – thelatemail

1

因此,對於一個給定的v1

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