【发布时间】:2022-01-18 22:36:20
【问题描述】:
我有下面给出的玩具数据。
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。有人可以告诉我怎么做吗?
这是所需的输出。
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
【问题讨论】:
-
如果你只需要
D,为什么不能是tmp[, R1 := "D"] -
我不想丢失
R1中的值,并希望将它们转移到R2,同时将R1替换为D。 -
对造成混乱表示歉意。我在之前的专栏中选择了有趣的专栏
A,pmin和pmax工作得很好。但是当我在A to Z之间给出一个字母时,解决方案失败了。 -
基于您的新数据。我认为
tmp[R2 == "D", c("R1", "R2") := .(R2, R1)] -
是的,这个解决方案有效并且看起来更直观。你能回答吗?我不确定交换是否更早发生或
R2首先被D替换?
标签: r data.table