[英]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)))
}
}
基本上,我有兩個向量years
和type
。 我正在找到每個類別的總和並將其合並到數據框中。 上面的代碼有效,但是我無法弄清楚如何使用循環功能之一。
是的,有多種方法可以使用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
是在years
和type
是type
給予t0
。 然后根據years
和type
匯總Emissions
。
t0 <- t[t$year %in% years & t$type %in% type, ]
aggregate(Emissions ~ year + type, t0, sum, na.rm = TRUE)
如果years
和type
向量包含所有年份和類型,則可以省略第一行,第二行中的t0
替換為t
。
下次,請使您的示例可重復。
更新一些更正。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.