2016-09-10 12 views
1

に基づいdata.table R行を選択し、我々は行番号または状態に基づいて行を選択することができる:data.tableの行番号及び条件

> x <- data.table(letters[1:4], 1:4) 
> x 
    V1 V2 
1: a 1 
2: b 2 
3: c 3 
4: d 4 
> x[2] 
    V1 V2 
1: b 2 
> x[V1 == "d"] 
    V1 V2 
1: d 4 

Iは、行番号及び条件の両方を選択することはできませんが:!2この形式の行番号として解釈されないため

> x[!2 & V2 > 1] 
Empty data.table (0 rows) of 2 cols: V1,V2 

と考えられます。私は今、それが唯一の中間チェーンdata.tableの列を作成し、このサブセットのための新しい列の値

x[!2][V2 > 1, V3 := "more"] 

を割り当てるたかっしかし

> x[!2][V2 > 1] 
    V1 V2 
1: c 3 
2: d 4 

:私は、私はチェーンの二つの条件をすることができます知っていました。中間テーブルを保存して元のテーブルにマージすることはできますが、面倒です。

実際に私はしばしばdata.tableが適切な行番号を必要と感じます。 .Iはグループに依存する動的数値ですが、すべての行を識別できる一意のIDが必要でした。この一意のIDはマージ/結合で非常に便利です(データには一意のIDがないことがよくあります)。 .iは、行番号である場合、私は

x[(.i != 2) & (V2 >1), V3 := "more"] 

を使用することができ、私は明示的に最初の行番号列を作成することによって、これをシミュレートすることができます。

もう1つの方法は、サブセットdata.tableの変更を元のテーブルに適用することです。 xを元のテーブルとして、x [!2]を部分集合とした場合、x[!2]の修正が実際にxを修正すると、私の問題も解決されます。もちろん、この種のサブセットは異なる方法で作成する必要があります(例:x[!2, refOriginal = TRUE])。ここ

+0

リアルについての議論を発見行番号[ここ](https://github.com/Rdatatable/data.table/issues/1494)、多数の類似した意見を共有しています。 – dracodoc

答えて

2

は、溶液に向けて私の2回の試行である:最初のものは、サブセットのための位置iに行番号.Iと条件を使用して列を更新論理ベクトルを計算するdata.tableの集計構文を使用します。二つ目は、一方であなたは、行番号と条件、setdiffand操作はunionと交換することができる必要がある場合は、条件から特定の行番号を削除するにはwhichsetdiffを使用しています:

x[x[, .I != 2 & V2 > 2], V3 := "more"] 
x 
# V1 V2 V3 
# 1: a 1 NA 
# 2: b 2 NA 
# 3: c 3 more 
# 4: d 4 more 


x[setdiff(which(V2 > 2), c(2)), V3 := "more"] 
x 
# V1 V2 V3 
# 1: a 1 NA 
# 2: b 2 NA 
# 3: c 3 more 
# 4: d 4 more 
+0

最初のチップに感謝します。私は 'i'で条件を使うことに自分自身を制限し、' j'で条件を使って論理的なベクトルを作り、 'i'として働きました。それは賢明なアイデアです。行番号として '.I'を使う唯一の回避策かもしれません。つまり、私はこの使用法が 'data.table'で最適化されているのだろうかと思います。 – dracodoc

+0

私はマイクロベンチマークを行いました。基本的に最初の方法は連鎖構文と同じで、行番号条件なしの通常の選択的な列割り当ては半分の時間を使います。パフォーマンスは受け入れられると思います。 – dracodoc

+0

この特定の質問は、.I。の使い方で解決されましたが、私はまだ 'data.table'に行番号が必要だと思います。私が必要とするのは、forループと行番号の単純なロジックで解決することができますが、現在の構文では非常に難しい場合もあれば、本当に創造的である必要がある場合もあります。私は行番号は、データフレーム内のrow.namesの同じオーバーヘッドをもたらすべきではないと思う。 – dracodoc

関連する問題