簡體   English   中英

學習plyr ddply-一定程度上應用功能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM