gpt4 book ai didi

r - 如何避免函数which()中具有多个条件的for循环

转载 作者:行者123 更新时间:2023-12-01 21:40:31 26 4
gpt4 key购买 nike

我有一个 25 年的数据集,类似于以下内容:

        date name        value tag
1 2014-12-01 f -0.338578654 12
2 2014-12-01 a 0.323379254 4
3 2014-12-01 f 0.004163806 9
4 2014-12-01 f 1.365219477 2
5 2014-12-01 l -1.225602543 7
6 2014-12-01 d -0.308544089 9

这是复制它的方法:

set.seed(9)
date <- rep(seq(as.Date("1990-01-01"), as.Date("2015-01-1"), by="months"), each=50)
N <- length(date)
name <- sample(letters, N, replace=T)
value <- rnorm(N)
tag <- sample(c(1:50), N, replace=T)
mydata <- data.frame(date, name, value, tag)
head(mydata)

我想创建一个新的矩阵来存储满足多个条件的值。例如,具有名称j标签i的值的总和。我使用两个 for 循环和 which() 函数来过滤出正确的值。像这样:

S <- matrix(data=NA, nrow=length(unique(mydata$tag)), ncol=length(unique(mydata$name)))
for(i in 1:nrow(S)){
for (j in 1:ncol(S)){
foo <- which(mydata$tag == unique(mydata$tag)[i] & mydata$name == unique(mydata$name)[j])
S[i,j] <- sum(mydata$value[foo])
}
}

这对于小数据集来说还可以,但对于较大的数据集来说太慢了。是否可以避免 for 循环或以某种方式加速该过程?

最佳答案

您可以使用 reshape2 包中的 dcast,通过自定义函数对您的值求和:

library(reshape2)
dcast(mydata, name~tag, value.var='value', fun.aggregate=sum)

或者简单地xtabs,基础R:

xtabs(value~name+tag, mydata)

一些基准:

funcPer = function(){
S <- matrix(data=NA, nrow=length(unique(mydata$tag)), ncol=length(unique(mydata$name)))
for(i in 1:nrow(S)){
for (j in 1:ncol(S)){
foo <- which(mydata$tag == unique(mydata$tag)[i] & mydata$name == unique(mydata$name)[j])
S[i,j] <- sum(mydata$value[foo])
}
}
}

colonel1 = function() dcast(mydata, name~tag, value.var='value', fun.aggregate=sum)

colonel2 = function() xtabs(value~name+tag, mydata)

#> system.time(colonel1())
# user system elapsed
# 0.01 0.00 0.01
#> system.time(colonel2())
# user system elapsed
# 0.05 0.00 0.05
#> system.time(funcPer())
# user system elapsed
# 4.67 0.00 4.82

关于r - 如何避免函数which()中具有多个条件的for循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30413572/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com