用于通過索引對矢量進行分區并對該分區執行操作的慣用R代碼我試圖在R中找到慣用的方法來通過某個索引向量對數值向量進行分區,找到該分區中所有數字的總和,然后將每個單獨的條目除以該分區總和。換句話說,如果我從這開始:df <- data.frame(x = c(1,2,3,4,5,6), index = c('a', 'a', 'b', 'b', 'c', 'c'))我希望輸出創建一個向量(讓我們稱之為z):c(1/(1+2), 2/(1+2), 3/(3+4), 3/(3+4), 5/(5+6), 6/(5+6))如果我這樣做是SQL并且可以使用窗口函數,我會這樣做:select
x / sum(x) over (partition by index) as z
from df如果我使用plyr,我會做這樣的事情:ddply(df, .(index), transform, z = x / sum(x))但我想知道如何使用標準的R函數編程工具,如mapply / aggregate等。
3 回答

料青山看我應如是
TA貢獻1772條經驗 獲得超8個贊
如果您只在單個向量上運行并且只需要一個索引向量,則tapply非???/p>
dat <- 1:6
lev <- rep(1:3, each = 2)
tapply(dat, lev, function(x){x/sum(x)})
#$`1`
#[1] 0.3333333 0.6666667
#
#$`2`
#[1] 0.4285714 0.5714286
#
#$`3`
#[1] 0.4545455 0.5454545
#
unlist(tapply(dat, lev, function(x){x/sum(x)}))
# 11 12 21 22 31 32
#0.3333333 0.6666667 0.4285714 0.5714286 0.4545455 0.5454545

慕哥9229398
TA貢獻1877條經驗 獲得超6個贊
其他三種方法:
dat <- 1:6
lev <- rep(1:3, each = 2)
lapply(split(dat, lev), function(x){x/sum(x)})
by(dat, lev, function(x){x/sum(x)})
aggregate(dat, list(lev), function(x){x/sum(x)})
- 3 回答
- 0 關注
- 500 瀏覽
添加回答
舉報
0/150
提交
取消