Векторизация!
> dat <- data.frame(c1 = c("abc","dxf","ghi"), c2 = 2:4, w = c(1,0.5,1.5))
Эффективно, вы хотите c2 * w
, но нам нужно указать R посмотреть внутри фрейм данных:
> with(dat, c2 * w)
[1] 2.0 1.5 6.0
Который мы можем вставить обратно в dat
в одну строку:
> dat <- within(dat, c3 <- c2 * w)
> dat
c1 c2 w c3
1 abc 2 1.0 2.0
2 dxf 3 0.5 1.5
3 ghi 4 1.5 6.0
(Заменить c3
на c2
, если вы хотите перезаписать существующий c2
.)
Если у вас есть более одного числового столбца, отличного от весовых коэффициентов, вам потребуется немного другая стратегия, если вы хотите автоматизировать его (т.е. не указывать R, какие столбцы умножить на w
).
> ## dummy data
> dat2 <- data.frame(c1 = c("abc","dxf","ghi"), c2 = 2:4, w = c(1,0.5,1.5),
c3 = 5:7, c4 = 3:5)
> ## select the columns we want, all numerics, but not `w`
> want <- sapply(dat2, is.numeric) & names(dat2) != "w"
> ## then use want to index into dat2
> dat2[, want] <- with(dat2, dat2[, want] * w)
> dat2
c1 c2 w c3 c4
1 abc 2.0 1.0 5.0 3.0
2 dxf 1.5 0.5 3.0 2.0
3 ghi 6.0 1.5 10.5 7.5