Suppose I have a data frame with 6 columns, and I want to set col 1:3 to the values in col 4:6 (this comes up a lot when merging). With data frames it's easy:
假设我有一个包含6列的数据框,我想将col 1:3设置为col 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
With data.tables, not so much:
使用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)
This works, but seems extremely complicated for such a simple transformation:
这有效,但对于这样一个简单的转换似乎非常复杂:
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
The question is: is there a simpler way to assign one set of columns in a data table to the values from another set of columns in the same data table?
问题是:是否有更简单的方法将数据表中的一组列分配给同一数据表中另一组列的值?
2 个解决方案
#1
11
You can use the :=
operator and a with=FALSE
in each data.table:
您可以在每个data.table中使用:=运算符和a = 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
3
Perhaps a for loop would look better?
也许for循环看起来会更好?
for (i in 1:3) dt[[i]] = dt[[i+3]]
#1
11
You can use the :=
operator and a with=FALSE
in each data.table:
您可以在每个data.table中使用:=运算符和a = 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
3
Perhaps a for loop would look better?
也许for循环看起来会更好?
for (i in 1:3) dt[[i]] = dt[[i+3]]