Как установить несколько столбцов в таблице данных для значений из разных столбцов в одной и той же таблице данных?

Предположим, что у меня есть кадр данных с 6 столбцами, и я хочу установить col 1: 3 в значения в столбце 4: 6 (это происходит при слиянии). С кадрами данных это легко:

set.seed(1)
df <- data.frame(matrix(sample(1:100,30),ncol=6))
df
#   X1 X2 X3 X4 X5 X6
# 1 27 86 19 43 75 29
# 2 37 97 16 88 17  1
# 3 57 62 61 83 51 28
# 4 89 58 34 32 10 81
# 5 20  6 67 63 21 25

df[,1:3] <- df[,4:6]                    # very, very straightforward...
df
#   X1 X2 X3 X4 X5 X6
# 1 43 75 29 43 75 29
# 2 88 17  1 88 17  1
# 3 83 51 28 83 51 28
# 4 32 10 81 32 10 81
# 5 63 21 25 63 21 25

С data.tables не так много:

library(data.table)
dt <- data.table(df)
dt[,1:3,with=F] <- dt[,4:6,with=F]
## Error in `[<-.data.table`(`*tmp*`, , 1:3, with = F, value = list(X4 = c(43L,  : unused argument (with = F)

Это работает, но кажется чрезвычайно сложным для такого простого преобразования:

dt[, names(dt)[1:3]:=dt[,4:6,with=F]]   # very, very complicated...
dt
#    X1 X2 X3 X4 X5 X6
# 1: 43 75 29 43 75 29
# 2: 88 17  1 88 17  1
# 3: 83 51 28 83 51 28
# 4: 32 10 81 32 10 81
# 5: 63 21 25 63 21 25

Вопрос: есть ли более простой способ присвоить одному набору столбцов в таблице данных значения из другого набора столбцов в одной и той же таблице данных?

Ответ 1

Вы можете использовать оператор := и with=FALSE в каждой таблице данных.

dt[, 1:3 := dt[, 4:6, with=FALSE], with=FALSE]

> dt
   X1 X2 X3 X4 X5 X6
1: 43 75 29 43 75 29
2: 88 17  1 88 17  1
3: 83 51 28 83 51 28
4: 32 10 81 32 10 81
5: 63 21 25 63 21 25

Ответ 2

Возможно, цикл for будет выглядеть лучше?

for (i in 1:3) dt[[i]] = dt[[i+3]]