簡體   English   中英

如何使用 R 交換 data.table 中的列值

[英]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

我想交換列R1R2中的值,以便所有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 完全一致(也就是說, R1R2從來都不是有趣的,...很有趣,如第 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM