![](/img/trans.png)
[英]How do I replace values in a data.table's column using a look up table? [R]
[英]How to swap column values in a data.table using R
我有下面給出的玩具數據。
library(data.table)
(tmp <- data.table(R1 = c('D','D','D','T','C'), y = 10:1, R2 = c('D','A','Z','D','D')))
R1 y R2
1: D 10 D
2: D 9 A
3: D 8 Z
4: T 7 D
5: C 6 D
6: D 5 D
7: D 4 A
8: D 3 Z
9: T 2 D
10: C 1 D
我想交換列R1
和R2
中的值,以便所有A
都列在 R1 下,不常見的值轉到 R2。 有人可以告訴我怎么做嗎? 這是所需的 output。
R1 y R2
1: D 10 D
2: D 9 A
3: D 8 Z
4: D 7 T
5: D 6 C
6: D 5 D
7: D 4 A
8: D 3 Z
9: D 2 T
10: D 1 C
以下是下面提供的答案的性能結果 -
Unit: milliseconds
expr min lq mean median uq max neval cld
akrun 5.524562 5.587740 7.526681 5.605406 5.938955 14.976740 5 b
r2evans 1.466862 1.489944 1.509321 1.500263 1.536402 1.553134 5 a
基於更新,我們可以在i
上指定一個邏輯表達式並交換要分配的列值
library(data.table)
val <- "D"
tmp[R2 == val, c("R1", "R2") := .(R2, R1)]
-輸出
> tmp
R1 y R2
1: D 10 D
2: D 9 A
3: D 8 Z
4: D 7 T
5: D 6 C
6: D 5 D
7: D 4 A
8: D 3 Z
9: D 2 T
10: D 1 C
我懷疑另一個答案可能是最適用的,但如果您的需求不是基於字典排序(實際上只是存在於一組“有趣”值中),那么
interesting <- c("A")
tmp[, c("R1", "R2") := .(
fifelse(R2 %in% interesting & !R1 %in% interesting, R2, R1),
fifelse(R2 %in% interesting & !R1 %in% interesting, R1, R2))]
tmp
# x R1 R2
# <int> <char> <char>
# 1: 1 A A
# 2: 2 A F
# 3: 3 A T
# 4: 4 A G
# 5: 5 A I
# 6: 6 A A
# 7: 7 A F
# 8: 8 A T
# 9: 9 A G
# 10: 10 A I
我承認這看起來有點笨拙,重復計算條件。 這可以很容易地作為臨時變量在tmp
框架內部或外部更有效地工作,例如:
tmp[, swap := R2 %in% interesting & !R1 %in% interesting
][, c("R1", "R2") := .(fifelse(swap, R2, R1), fifelse(swap, R1, R2))
][, swap := NULL]
如果您確定R2 %in% interesting
Interest 與!R2 %in% interesting
Interest 完全一致(也就是說, R1
和R2
從來都不是有趣的,...很有趣,如第 1 行和第 6 行),那么您可以將其簡化為
tmp[, c("R1", "R2") := .(
fifelse(R2 %in% interesting, R2, R1),
fifelse(R2 %in% interesting, R1, R2))]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.