使用data.table交换两列之间的值

Bas*_*Bas 13 swap r data.table

我一直在试图将这个问题转化为data.table解决方案.(为了保持简单,我将使用相同的数据集)
V2 == "b我想在两者之间交换列V1 <-> V3.

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
Run Code Online (Sandbox Code Playgroud)

下面的代码将是工作的解决方案data.frame,但是由于我给我的挫折感,因为我使用了一个data.table没有意识到我现在决定找到data.table的解决方案.

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
Run Code Online (Sandbox Code Playgroud)

我尝试编写一个lapply循环遍历目标交换列表的函数,尝试将问题缩小到只替换一个值,尝试以不同方式调用列名但都没有成功.
这是我设法获得的最接近的尝试:

> 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)
Run Code Online (Sandbox Code Playgroud)

我们如何获得data.table解决方案?

akr*_*run 13

我们可以尝试

dt[V2=="b", c("V3", "V1") := .(V1, V3)]
Run Code Online (Sandbox Code Playgroud)