[英]learning plyr ddply - applying function up to a point
我正在學習plyr軟件包,正在使用內置的“棒球”數據集進行練習。 這是示例數據(整個數據框架相當寬,因此我僅從練習的角度發布了相關的部分):
data(baseball)
baseball <- baseball[with(baseball, order(id, year)), ]
rownames(baseball) <- NULL
head(baseball[,c("id","year", "ab")])
id year ab
1 aaronha01 1954 468
2 aaronha01 1955 602
3 aaronha01 1956 609
4 aaronha01 1957 615
5 aaronha01 1958 601
6 aaronha01 1959 629
我想做的是向該數據幀添加另一列,該列將包含最新的平均“蝙蝠次數”(ab變量),因此對於前三行,它看起來像這樣:
id year ab atb
1 aaronha01 1954 468 468
2 aaronha01 1955 602 535
3 aaronha01 1956 609 559.6667
現在我知道我應該使用ddply和transform函數,但是我不知道語法應該如何尋找從值到特定索引的均值:
baseball <- ddply(baseball, ~ id, transform, atb = ???)
將不勝感激。
這是data.table
的方法。
# load data.table
library(data.table)
# cast data.frame as data.table
setDT(baseball)
# perform the calculation
baseball[, atb := cumsum(ab) / seq_len(.N), by=id]
在此,將atb計算為蝙蝠的累積總和( cumsum(ab)
)除以直到該點為止觀察到id的年數( seq_len(.N)
),然后通過id進行計算。
這回來
head(baseball[,c("id","year", "ab", "atb")])
id year ab atb
1: aaronha01 1954 468 468.0000
2: aaronha01 1955 602 535.0000
3: aaronha01 1956 609 559.6667
4: aaronha01 1957 615 573.5000
5: aaronha01 1958 601 579.0000
6: aaronha01 1959 629 587.3333
在基礎R中,您可以通過tapply
來完成此操作
baseball$atb2 <- unlist(tapply(baseball$ab, baseball$id,
function(i) cumsum(i) / seq_along(i)))
all.equal(baseball$atb, baseball$atb2)
[1] TRUE
這是使用dplyr
的選項
library(dplyr)
baseball %>%
group_by(id) %>%
mutate(atb = cummean(ab))
或者我們可以從base R
使用ave
baseball$atb <- with(baseball, ave(ab, id, FUN = function(x) cumsum(x)/seq_along(x)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.