簡體   English   中英

函數列表上方的數據框列表,不嵌套apply()

[英]Function list over a list of data frames without nesting apply()

使用下面的數據dat ,我正在嘗試獲得以下結果,僅不進行嵌套
lapply(, sapply...) ,如下所示。

> lapply(dat, function(x) sapply(funs, function(y) y(x)))
# $bondsba01
#   AVG   SLG 
# 0.223 0.300 
#
# $pujolal01
#   AVG   SLG 
# 0.329 0.422 

我對rapply()很熟悉,但是在此列表上實現它時遇到了麻煩。 我認為,由於dat是數據幀列表,因此此調用相當於一個列表列表,並且rapply是合適的。

我嘗試了rapply()的一些變體,並且幾乎每次都遇到相同的錯誤。

> rapply(funs, function(x) x(dat), how = "replace")
#  Error in eval(expr, envir, enclos) : object 'H' not found 

how = "list"how = "unlist"時,出現相同的錯誤, how = "list"在不將sapplylapply嵌套的情況下執行此lapply

樣本數據:

dat <- 
structure(list(bondsba01 = structure(list(AB = 413L, R = 72L, 
    H = 92L, X2B = 26L, X3B = 3L, HR = 16L, RBI = 48L, SB = 36L, 
    CS = 7L, BB = 65L, SO = 102L, IBB = 2L, HBP = 2L, SH = 2L, 
    SF = 2L), .Names = c("AB", "R", "H", "X2B", "X3B", "HR", 
"RBI", "SB", "CS", "BB", "SO", "IBB", "HBP", "SH", "SF"), row.names = 1L, 
    class = "data.frame"), 
    pujolal01 = structure(list(AB = 590L, R = 112L, H = 194L, 
        X2B = 47L, X3B = 4L, HR = 37L, RBI = 130L, SB = 1L, CS = 3L, 
        BB = 69L, SO = 93L, IBB = 6L, HBP = 9L, SH = 1L, SF = 7L), 
    .Names = c("AB", "R", "H", "X2B", "X3B", "HR", "RBI", "SB", "CS", "BB",
    "SO", "IBB", "HBP", "SH", "SF"), row.names = 1L, class = "data.frame")),
    .Names = c("bondsba01", "pujolal01"))

功能列表:

funs <- 
structure(list(AVG = function (x) 
with(x, round(H/AB, 3)), SLG = function (x) 
with(x, round(((H - X2B - X3B - HR) + 2 * X2B + 3 * X3B + HR)/AB, 
    3))), .Names = c("AVG", "SLG"))

鏈接到實際數據

僅僅因為它是星期六的早晨,並且我想嘗試使用foreach ,所以這里有一個解決方案:

library(foreach)
library(iterators)

foreach(x=iter(dat), .combine=cbind) %:% 
  foreach(f=iter(funs), .combine=c)  %do% 
  f(x)


     result.1 result.2
[1,]    0.223    0.329
[2,]    0.300    0.422

這應該很快,但是更重要的是,並行化foreach非常容易。 您只需要進行兩項更改:

  • 加載您喜歡的並行包(我使用doParallel )並注冊集群
  • %do%更改為%dopar%

像這樣:

library(doParallel)
cl <- makePSOCKcluster(2)
registerDoParallel(cl)
foreach(x=iter(dat), .combine=cbind) %:% 
  foreach(f=iter(funs), .combine=c)  %dopar% 
  f(x)

     result.1 result.2
[1,]    0.223    0.329
[2,]    0.300    0.422

stopCluster(cl)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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