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
在单行:
> 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
(如果要覆盖现有的01,请将c3
替换为。)
如果除了权重以外还有多个数字列,那么如果要自动执行它,则需要一个简单的策略。不告诉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
这看起来很棒! – speendo 2011-02-23 14:27:04
优秀的技术提取数字列,然后重新插入它们。谢谢! – drbv 2012-09-12 19:09:44