Я передумал переводить этот вопрос в решение 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?