2016-08-31 3 views
0

ある条件が他の条件で満たされるたびに、どのようにプログレッシブ数値を列に割り当てることができますか?このデータを考える:条件を満たす場合にプログレッシブ番号を割り当てる - R

a <- data.frame(var = c(1, 0, 0, 1, 4, 5, 6, 1, 7, 1, 1)) 

私は徐々に1度にするvar == 1によって増大し、残りのためのNAを返すされている列を構築したいと思います。新しい列は、その後で満たされる必要があります。

1, NA, NA, 2, NA, NA, NA, 3, NA, 4, 5 

私はifelseについて考えたが、私はそれを動作させるために管理していませんでした。 ありがとう!

あなたが ifelsecumsumを使用することができます

答えて

2

a$newvar <- ifelse(a$var==1, cumsum(a$var==1), NA) 
    var newvar 
1 1  1 
2 0  NA 
3 0  NA 
4 1  2 
5 4  NA 
6 5  NA 
7 6  NA 
8 1  3 
9 7  NA 
10 1  4 
11 1  5 
0

我々はまた、cumsum

a$newVar <- with(a, cumsum(var ==1) * NA^(var!=1)) 
a$newVar 
#[1] 1 NA NA 2 NA NA NA 3 NA 4 5 

またはdata.tableを使用しての変化でこれを行うことができ、我々は 'data.frame' を変換します'data.table'(setDT(a))に、 'i'(var == 1)に論理条件を指定し、(:=)は、 'var'のcumsumが 'newvar'に割り当てられるので効率的です。デフォルトでは、論理条件に対応していない 'newvar'の他の要素はNAで埋められます。

library(data.table) 
setDT(a)[var==1, newvar := cumsum(var)] 
a 
# var newvar 
# 1: 1  1 
# 2: 0  NA 
# 3: 0  NA 
# 4: 1  2 
# 5: 4  NA 
# 6: 5  NA 
# 7: 6  NA 
# 8: 1  3 
# 9: 7  NA 
#10: 1  4 
#11: 1  5 

またはその代わりのcumsum私たちは、私はちょうどあなたが同じことをしたい場合はここで一般的なケースのためにもう一つを追加したい行

setDT(a)[var==1, newvar := seq_len(.N)] 
0

のシーケンスを使用することができます4または5または他の任意のもの

a <- data.frame(var = c(1, 0, 0, 1, 4, 5, 6, 1, 7, 1, 1)) 

a$New <- ifelse(a$var == 1,1,NA) 
a$New[!is.na(a$New)] <- cumsum(a$New[!is.na(a$New)]) 

出力:

> print(a) 
    var New 
1 1 1 
2 0 NA 
3 0 NA 
4 1 2 
5 4 NA 
6 5 NA 
7 6 NA 
8 1 3 
9 7 NA 
10 1 4 
11 1 5 
+0

または 'a $ New < - NA; $ $ [$ var == 1] < - cumsum($ var [a $ var == 1]) ' –

+0

var = 0を数えるとどうなりますか?または他の番号? – Kou

+0

この場合、新しいvarは0になります。出力:[1] NA 0 0 NA NA NA NA NA NA NA NA;望ましい出力:[1] NA 1 2 NA NA NA NA NA NA NA NA – Kou

関連する問題