2017-02-07 11 views
0

データフレーム内の指定されたエントリの値が前と異なるdata.frameから情報を抽出することに興味があります。ここでは例のフレームは、次のとおりです。前の行で値が異なるdata.frame行を高速でプル

df <- data.frame(name = rep("a",5), val1 = c(1,1,2,2,2), val2 = c(10,11,12,13,14)) 

> df 
    name val1 val2 
1 a 1 10 
2 a 1 11 
3 a 2 12 
4 a 2 13 
5 a 2 14 

私はトラックを保ち、1から2にval1変化は、私は、データフレーム内のすべてのエントリを反復処理してこれを行うことができ、行2と3、内の情報を抽出することに興味を持っています前のval1のように、私は2つの関連する行をプルすることができますが、私はデータフレームが非常に大きいときにこれを行うより高速またはより効率的な方法があるのだろうかと思います。 Rは典型的には反復よりも速い情報抽出方法を持っていますが、私はここで何を使うべきか分かりません。

答えて

2

一つの方法は、diffと論理サブセットを使用することです:

keepers <- diff(df$val1) 
df[as.logical(c(0, keepers) + c(keepers, 0)),] 
    name val1 val2 
2 a 1 11 
3 a 2 12 

diffは、値の変化を捉えます。変更前の最初の行と変更前の最後の行をキャプチャするために0が付加され、付加され、これらのベクトルが加算され、結果として1と0のベクトルになります。 as.logicalは、これを論理ベクトルに変換します。論理ベクトルは、行のサブセットに使用されます。

1

これは、グループの最初と最後の行を選択することと本質的に同じ問題です。そこから最初と最後の行を削除できます。単純なデータテーブル溶液は次のようになります

library(data.table) 
zz=data.table(df) 
yy=zz[, .SD[c(1,.N)], by=val1] 
yy[2:(nrow(yy)-1)] 
0

我々は、以前のものと同様のものではなく、その後もそのインデックスから1を減算することにより、その上に一つの行を選択した行のインデックスを取得するdplyrからlagを使用することができます。 diff

library(dplyr) 
i1 <- which(df$val1 != lag(df$val1)) 
df[sort(c(i1, i1-1)),] 

#name val1 val2 
#2 a 1 11 
#3 a 2 12 

別の例として、

df <- data.frame(name=rep("a", 7),val1=c(1,1,2,2,2,3, 3), val2=c(10,11,12,13,14, 15, 16)) 
df 
df 
# name val1 val2 
#1 a 1 10 
#2 a 1 11 
#3 a 2 12 
#4 a 2 13 
#5 a 2 14 
#6 a 3 15 
#7 a 3 16 

i1 <- which(df$val1 != lag(df$val1)) 
df[sort(c(i1, i1-1)),] 

# name val1 val2 
#2 a 1 11 
#3 a 2 12 
#5 a 2 14 
#6 a 3 15 
2

あなたはdiffがあなたに行数より1つの少ない値を与えるという事実を利用することができます。 :したがって

> which(diff(df$val1)==1) + 0:1 
[1] 2 3 

:望ましい結果で

df[which(diff(df$val1)==1) + 0:1, ] 

結果:

name val1 val2 
2 a 1 11 
3 a 2 12 

which(diff(df$val1)==1) + 0:1 
# instead of '==1' you can also use '>0' or '!=0': which(diff(df$val1)!=0) + 0:1 

あなたは、変更後の前の行のインデックスと行を取得します


別の素敵なR-トリCはheadtailの結果を比較している:

which(head(df$val1,-1) != tail(df$val1,-1)) + 0:1 

これは、同じインデックス(!オフコース)になります。

+0

'diff'は単一の操作であるため、より速くなりますか? – oregano

+0

@確かではない、あなたはそれをテストしなければならないでしょう – h3rm4n

関連する問題