部分更新data.table中的行

时间:2017-03-28 10:01:58

标签: r data.table

我们假设我们有以下数据。表:

> 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

1 个答案:

答案 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更改