Vectorise!
> 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
これを1行で挿入し直すことができます。
> 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