我一直在煞费苦心地翻译这个问题,以求用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
下面的代码是对于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
我已经尝试编写了一个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)
我们如何获得data.table解决方案?
.SD
比传递list(V1, V3)
要快? - BenBarneslist(V1, V3)
也可以。 - akrun.SDcols
有什么意见吗?我认为如果你有一个预定义列的向量,它是更强大的解决方案。 - David Arenburg.SDcols
没有任何意见,当它被适当地使用时。在这种情况下,它只是增加了额外的符号来表示类型,并使解决方案更加不透明。 - eddi