使用data.table

时间:2016-04-25 06:43:36

标签: r data.table swap

我一直在试图将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解决方案?

2 个答案:

答案 0 :(得分:10)

我们可以尝试

dt[V2=="b", c("V3", "V1") := .(V1, V3)]

答案 1 :(得分:2)

仅供娱乐。 @ akruns&#39;解决方案显然优越。我推断我可以创建一个临时副本,进行条件交换,然后按顺序删除所有使用[.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