使用 data.table 在两列之间交换值
Swapping values between two columns using data.table
我一直在为将 this question 翻译成 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 解决方案?
我们可以试试
dt[V2=="b", c("V3", "V1") := .(V1, V3)]
仅供娱乐。 @akruns 的解决方案显然更胜一筹。我推断我可以创建一个临时副本,进行条件交换,然后按顺序使用 [.data.table
操作删除所有副本:
dt[, tv1 := V1][V2=="b", V1 := V3][V2=="b", V3 := tv1][ , tv1 := NULL]
> dt
V1 V2 V3
1: 1 a 2
2: 2 a 3
3: 1 b 4
我一直在为将 this question 翻译成 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 解决方案?
我们可以试试
dt[V2=="b", c("V3", "V1") := .(V1, V3)]
仅供娱乐。 @akruns 的解决方案显然更胜一筹。我推断我可以创建一个临时副本,进行条件交换,然后按顺序使用 [.data.table
操作删除所有副本:
dt[, tv1 := V1][V2=="b", V1 := V3][V2=="b", V3 := tv1][ , tv1 := NULL]
> dt
V1 V2 V3
1: 1 a 2
2: 2 a 3
3: 1 b 4