Подтвердить что ты не робот

Обмен значениями между двумя столбцами с использованием 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

Код ниже будет рабочим решением для 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, зацикляющую список моих целевых swapping, попытался сузить проблему, чтобы заменить только одно значение, попытался вызвать имена столбцов по-разному, но все без успеха.
Это была самая близкая попытка, которую мне удалось получить:

> 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?

4b9b3361

Ответ 1

Мы можем попробовать

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

Ответ 2

Только для развлечения. Решение @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