簡體   English   中英

如何將這些嵌套循環轉換為R循環函數,例如sapply或tapply或

[英]How can I convert these nested loops into an R loop function like sapply or tapply or

我有運行在數據幀t上的這段代碼。

for (i in years){
    for (j in type){
            x <- rbind(x, cbind(i, j, 
                       sum(t[(t$year == i) & (t$type == j),]$Emissions, 
                           na.rm = TRUE)))
}
}

基本上,我有兩個向量yearstype 我正在找到每個類別的總和並將其合並到數據框中。 上面的代碼有效,但是我無法弄清楚如何使用循環功能之一。

是的,有多種方法可以使用apply函數。 不過,我將建議使用dplyr的高性能方法。

library(dplyr)
x <- t %>% 
     group_by(year,type) %>% 
     summarize(SumEmmissions=sum(Emissions,na.rm=TRUE)) 

我認為您會發現它比循環或應用方法要快得多。

===================根據要求提供證明===============

library(dplyr) N <- 1000000 Nyear <- 50 Ntype <- 40 myt <- data.frame(year=sample.int(50,N,replace=TRUE), type=sample.int(4,N,replace=TRUE), Emissions=rnorm(N) ) years <- 1:Nyear type <- 1:Ntype v1 <- function(){ x <- myt %>% group_by(year,type) %>% summarize(SumEmmissions=sum(Emissions,na.rm=TRUE)) } v2 <- function(){ x <- data.frame() for (i in years){ for (j in type){ x <- rbind(x, cbind(i, j, sum(myt[(myt$year == i) & (myt$type == j),]$Emissions, na.rm = TRUE))) } } } v3 <- function(){ t0 <- myt[myt$year %in% years & myt$type %in% type, ] x <- aggregate(Emissions ~ year + type, t0, sum, na.rm = TRUE) } system.time(v1()) user system elapsed 0.051 0.000 0.051 system.time(v2()) user system elapsed 176.482 0.402 177.231 system.time(v3()) user system elapsed 7.758 0.011 7.783

隨着組的大小和數量的增加,性能也會擴展。

挑選出所有行的這year是在yearstypetype給予t0 然后根據yearstype匯總Emissions

t0 <- t[t$year %in% years & t$type %in% type, ]
aggregate(Emissions ~ year + type, t0, sum, na.rm = TRUE)

如果yearstype向量包含所有年份和類型,則可以省略第一行,第二行中的t0替換為t

下次,請使您的示例可重復。

更新一些更正。

暫無
暫無

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

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