2016-04-25 9 views
10

this questiondata.tableに変換することに頭を痛めています。 (単純なままにしておくと、同じデータセットを使用します)
V2 == "bV1 <-> V3の間の列を交換したい場合。data.tableを使用して2つの列間の値を交換する

dt <- data.table(V1=c(1,2,4), V2=c("a","a","b"), V3=c(2,3,1)) 
#V1 V2 V3 
#1: 1 a 2 
#2: 2 a 3 
#3: 4 b 1 

次のコードは、しかしので、私は私が今data.tableのための解決策を見つけることが決定したよ実現することなくdata.tableを使用していたので、これは私に与えられたフラストレーションの量のdata.frameのための作業溶液、だろう。私は私の目標スワップリストをループlapply機能を書いて試してみました

dt <- data.table(V1=c(1,2,4), V2=c("a","a","b"), V3=c(2,3,1)) 
df <- as.data.frame(dt) 
df[df$V2 == "b", c("V1", "V3")] <- df[df$V2 == "b", c("V3", "V1")] 
# V1 V2 V3 
#1 1 a 2 
#2 2 a 3 
#3 1 b 4 

は、一つの値だけを置き換えるために、問題を絞り込むしようとした列の異なる方法で名前が、すべて成功せずを呼び出そうとしました。

> dt[dt$V2 == "b", c("V1", "V3")] <- dt[dt$V2 == "b", c(V3, V1)] 
#Warning messages: 
#1: In `[<-.data.table`(`*tmp*`, dt$V2 == "b", c("V1", "V3"), value = c(1, : 
# Supplied 2 items to be assigned to 1 items of column 'V1' (1 unused) 
#2: In `[<-.data.table`(`*tmp*`, dt$V2 == "b", c("V1", "V3"), value = c(1, : 
# Supplied 2 items to be assigned to 1 items of column 'V3' (1 unused) 

がどのように我々はdata.table解決策を得ることができます。
これは私が得ることができた最も近いの試みでしたか?

答えて

8

我々は唯一の娯楽のために

dt[V2=="b", c("V3", "V1") := .(V1, V3)] 
+0

私は.SD'は 'リスト(V1を渡すよりも高速である'使用して推測し、V3 ) '? – BenBarnes

+1

@BenBarnes私はそれが速くなるかどうかテストしませんでした。 'list(V1、V3)'のように見えます。 – akrun

+0

@eddi、あなたは '.SDcols'に対して何を持っていますか?私はそれが事前定義された列のベクトルを持っている場合に、より堅牢なソリューションだと思います。 –

2

を試すことができます。 @akrunsのソリューションは明らかに優れています。私は、一時的なコピーを作成し、条件付き交換を行い、その後、順番にすべての[.data.table操作を使用してコピーを削除できることを推論:

dt[, tv1 := V1][V2=="b", V1 := V3][V2=="b", V3 := tv1][ , tv1 := NULL] 

> dt 
    V1 V2 V3 
1: 1 a 2 
2: 2 a 3 
3: 1 b 4 
+0

これは間違った値を入れ替えます! look cools tho – Bas

+5

ああ、はい、私は "b"値の代わりに "a"値を交換していました。それは非常に遅くなるので、修正する価値はほとんどないと思われる。私は人々がトマトを投げることができるように投稿しました。あなたが面白いことを目指しているなら少なくとも –

+0

は "bitwXor"解決策を実行します。そのままではありません – eddi

関連する問題