我们假设我们有以下数据。表:
> dt <- as.data.table(mtcars)
> head(dt)
mpg cyl disp hp drat wt qsec vs am gear carb
1: 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
2: 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
3: 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
4: 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
5: 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
6: 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
我想使用向量cyl:wt
更新第一行的列vec <- 1:5
,以便:
> head(dt)
mpg cyl disp hp drat wt qsec vs am gear carb
1: 21.0 1 2 3 4 5 16.46 0 1 4 4
2: 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
3: 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
4: 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
5: 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
6: 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
我试过了:
dt[1, .SD := vec, .SDcols = cyl:wt] # fails
dt[1, (.SD) := .(vec), .SDcols = cyl:wt] # fails
答案 0 :(得分:0)
.SD
lhs
无法用于:=
进行分配。我们需要一个角色向量。另一个选项是set
j1 <- which(names(dt) %in% c('cyl', 'wt'))
j2 <- j1[1]:j1[2]
for(j in seq_along(j2)){
set(dt, i = 1, j = j2[j], value = vec[j])
}
head(dt)
# mpg cyl disp hp drat wt qsec vs am gear carb
#1: 21.0 1 2 3 4.00 5.000 16.46 0 1 4 4
#2: 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#3: 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
#4: 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
#5: 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
#6: 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
注意:我们在更新值时必须小心,并应检查原始列的class
,因为它可能会numeric/integer
更改