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)