2017-06-19 2 views
1

データフレームaには、0と非0の値があります。例えば:ゼロ以外のインデックスを見つけて、発生間隔を数えてください

0,0,0,30,0,05,0,0,0,0,0,6,0,0,7,0 

Iはwhich(a!=0)を使用して非ゼロのインデックスを取得しようと4 6 12 15を得ることができました。しかし、私の結果は次のようになります:

Col1 Col2 
0 - 
0 - 
0 - 
30 4 
0 - 
5 2 
0 - 
0 - 
0 - 
0 - 
0 - 
6 6 
0 - 
0 - 
7 3 
0 - 

私が必要とするのは、連続する2番目の列の違いです。 0に対する値は、マッチングベクトル作成ブランクまたは0

答えて

3
x <- c(0,0,0,30,0,05,0,0,0,0,0,6,0,0,7,0) 

のいずれかであり得る:

y <- rep(NA,length(x)) 

をIは、NAと空のスロットを埋め。数値の列に「空白」のプレースホルダを使用することは実際には不可能です。あなたはrep(0,length(x))(またはその代わりにnumeric(length(x))を使用することができ

非ゼロ要素を検索します。

nzpos <- which(x!=0) 

を適切な値に非ゼロの位置を入力します。

y[nzpos] <- c(nzpos[1],diff(nzpos)) 
data.frame(x,y) 
+1

このコードの最初の要素がゼロであれば(それはNAを設定、または多分ゼロなければならない)間違った値を返します。私は同じ問題を抱えていた;) – digEmAll

2

をあなたにrle機能を使用することができます連続する等しい値を数える:

DF <- data.frame(Col1=c(0,0,0,30,0,05,0,0,0,0,0,6,0,0,7,0),Col2=NA) 

# count the length of groups of consecutive zeros 
rleRes <- rle(DF$Col1==0) 
# we add +1 since we include the next non-zero in the count 
counts <- rleRes$lengths[rleRes$values] + 1 
# if the last group of zero is not terminated by a non-zero, 
# we don't need to add the last count 
if(tail(DF$Col1,1) == 0) 
    counts <- counts[-length(counts)] 
# if the first value is non-zero, then we need to set Count=0 (or NA) because 
# is not preceded by a group of zero 
if(head(DF$Col1,1) != 0) 
    counts <- c(0,counts) 
# set the count on the second Column 
DF$Col2[DF$Col1!=0] <- counts 

> DF 
    Col1 Col2 
1  0 NA 
2  0 NA 
3  0 NA 
4 30 4 
5  0 NA 
6  5 2 
7  0 NA 
8  0 NA 
9  0 NA 
10 0 NA 
11 0 NA 
12 6 6 
13 0 NA 
14 0 NA 
15 7 3 
16 0 NA 
3

期待される結果を得るには、得られた値を単純に引くことができます。

which(a!=0) - c(0, which(a!=0)[-4]) # 4 2 6 3 

この値で新しい列を作成することができます。

a$B <- 0 
a$B[which(a!=0)] <- which(a!=0) - c(0, which(a!=0)[-4]) 

出力:

A B 
1 0 0 
2 0 0 
3 0 0 
4 30 4 
5 0 0 
6 5 2 
7 0 0 
8 0 0 
9 0 0 
10 0 0 
11 0 0 
12 6 6 
13 0 0 
14 0 0 
15 7 3 
16 0 0 
+0

私はこれをするつもりだと思ったが、多分私はこれのためにいくつかの機能がないかもしれない。ありがとうたくさん:) –

+0

このコードは、最初の要素がゼロでない場合(NAを設定する必要があります、またはゼロかもしれません)、間違った値を返します。私も同じ問題があった;) – digEmAll

関連する問題