R “矢量化的正确方法”;查阅“;功能
我正在寻找一种快速有效的方法来计算下面描述的问题。任何帮助都将不胜感激,提前感谢 我有两个非常大的csv文件,它们具有关于同一对象的不同信息,但在我的最终计算中,我需要不同表中的所有属性。我试图计算大量变电站的负荷,首先我有一个独特的变电站列表R “矢量化的正确方法”;查阅“;功能,r,rstudio,R,Rstudio,我正在寻找一种快速有效的方法来计算下面描述的问题。任何帮助都将不胜感激,提前感谢 我有两个非常大的csv文件,它们具有关于同一对象的不同信息,但在我的最终计算中,我需要不同表中的所有属性。我试图计算大量变电站的负荷,首先我有一个独特的变电站列表 Unique_Substations <- data.frame(Name = c("SubA", "SubB", "SubC", "SubD")) Customer_Information <- data.frame( Custome
Unique_Substations <- data.frame(Name = c("SubA", "SubB", "SubC", "SubD"))
Customer_Information <- data.frame(
Customer = 1001:1010,
SubSt_Nm = sample(unique(Unique_Substations$Name), 10, replace = TRUE),
HouseHoldType = sample(1:2, 10, replace = TRUE)
)
我肯定这一点效率都不高,但我不知道如何用其他方法来做
为了得到最终结果,我使用了一个外部函数
Results <- outer(1:nrow(Unique_Substations), 1:2, Vectorize(GetMax))
Results首先:set.seed()
生成随机数据时!在为这些结果编写代码之前,我设置了.seed(1000)
我认为在这里,稍微进行一下merge
-ing和dplyr
会有所帮助。首先,我们将数据转化为更好的形状:
library(dplyr)
library(reshape2)
HouseHoldLoad <- melt(HouseHoldLoad, value.name="Load") %>%
select(HouseHoldType=variable, Load) %>%
mutate(HouseHoldType=gsub("Type", "", HouseHoldType))
Solar_Panels <- melt(Solar_Panels, id.vars="Customer",
value.name="SPYearVal") %>%
select(Customer, SolarPanelYear=variable, SPYearVal) %>%
mutate(SolarPanelYear=gsub("SolarPanelYear", "", SolarPanelYear))
dat <- merge(Customer_Information, Solar_Panels, by="Customer")
现在我们只需分组和总结:
dat %>% group_by(SubSt_Nm, SolarPanelYear) %>%
summarise(mx=max(sum(SPYearVal)*SolarLoad))
## SubSt_Nm SolarPanelYear mx
## 1 SubA 1 295
## 2 SubA 2 350
## 3 SubB 1 180
## 4 SubB 2 170
## 5 SubC 1 135
## 6 SubC 2 190
## 7 SubD 1 145
## 8 SubD 2 190
如果您使用data.table
vs数据帧,即使有40K个条目,它也应该非常快速
更新对于那些无法安装dplyr
的用户,这只需使用reforme2
(希望可以安装)
首先,您不需要
data.frames
,因为每个对象中只有一种数据类型。向量和矩阵就足够了。下一步,不是哪个(foo%in%bar==TRUE)
,而是哪个(bar==foo)
(其中foo
是标量,bar
是向量或矩阵)。@CarlWitthoft哪个(foo%in%bar==TRUE)
与哪个(foo%in%bar)
相同,而不是哪个(bar==foo)
。以bar=c(0,1)
和foo=c(1,0)
为例,两者之间的差异非常明显。我同意当foo
只包含一个元素时,可以使用这两种方法,但它们不一样。@JorisMeys谢谢——很好point@JorisMeys谢谢我将更改此牙套以获得此答案,但不知何故,我的工作计算机似乎无法安装dplyr
软件包。此外,这个脚本将运行在一个远程服务器上,在那里我很遗憾无法安装软件包,没有dplyr有没有办法做到这一点?我不得不处理类似的情况(被有限的选项困住并不有趣)。现在答案中有两个类似的解决方案。我没有做任何计时,但我必须相信它们是按从快到慢的顺序排列的,特别是在大数据集上。另外,如果你能设法使用dplyr
,你甚至可以点击一个数据库,而不是需要一个摘录(我假设你正在使用)。好的,非常感谢!我会尝试一下,等它成功的时候再接受它!还有一个问题,因为我的实际数据集遇到了问题。这是因为我的实际客户信息数据是188k行,而我的实际家庭负荷向量是53k行。结果,我得到一个错误,结果中的行数超过了最大向量长度。有没有什么方法可以快速有效地实现这一点,而不需要涉及太多for循环?
GetMax <- function(i, Yr) {
max(sum(Solar_Panels[unlist(ML_Cust_SolarP[ML_SubSt_Cust[[i]]], use.names= FALSE),Yr])*SolarLoad)
}
Results <- outer(1:nrow(Unique_Substations), 1:2, Vectorize(GetMax))
library(dplyr)
library(reshape2)
HouseHoldLoad <- melt(HouseHoldLoad, value.name="Load") %>%
select(HouseHoldType=variable, Load) %>%
mutate(HouseHoldType=gsub("Type", "", HouseHoldType))
Solar_Panels <- melt(Solar_Panels, id.vars="Customer",
value.name="SPYearVal") %>%
select(Customer, SolarPanelYear=variable, SPYearVal) %>%
mutate(SolarPanelYear=gsub("SolarPanelYear", "", SolarPanelYear))
dat <- merge(Customer_Information, Solar_Panels, by="Customer")
## Customer SubSt_Nm HouseHoldType SolarPanelYear SPYearVal
## 1 1001 SubB 1 1 16
## 2 1001 SubB 1 2 18
## 3 1001 SubB 1 2 16
## 4 1001 SubB 1 1 20
## 5 1002 SubD 2 1 16
## 6 1002 SubD 2 1 13
## 7 1002 SubD 2 2 20
## 8 1002 SubD 2 2 18
## 9 1003 SubA 1 2 15
## 10 1003 SubA 1 1 16
## 11 1005 SubC 2 2 19
## 12 1005 SubC 2 1 10
## 13 1006 SubA 1 1 15
## 14 1006 SubA 1 2 19
## 15 1007 SubC 1 1 17
## 16 1007 SubC 1 2 19
## 17 1009 SubA 1 1 10
## 18 1009 SubA 1 1 18
## 19 1009 SubA 1 2 18
## 20 1009 SubA 1 2 18
dat %>% group_by(SubSt_Nm, SolarPanelYear) %>%
summarise(mx=max(sum(SPYearVal)*SolarLoad))
## SubSt_Nm SolarPanelYear mx
## 1 SubA 1 295
## 2 SubA 2 350
## 3 SubB 1 180
## 4 SubB 2 170
## 5 SubC 1 135
## 6 SubC 2 190
## 7 SubD 1 145
## 8 SubD 2 190
library(reshape2)
HouseHoldLoad <- melt(HouseHoldLoad, value.name="Load")
colnames(HouseHoldLoad) <- c("HouseHoldType", "Load")
HouseHoldLoad$HouseHoldType <- gsub("Type", "", HouseHoldLoad$HouseHoldType)
Solar_Panels <- melt(Solar_Panels, id.vars="Customer", value.name="SPYearVal")
colnames(Solar_Panels) <- c("Customer", "SolarPanelYear", "SPYearVal")
Solar_Panels$SolarPanelYear <- gsub("SolarPanelYear", "", Solar_Panels$SolarPanelYear)
dat <- merge(Customer_Information, Solar_Panels, by="Customer")
rbind(by(dat, list(dat$SubSt_Nm, dat$SolarPanelYear), function(x) {
mx <- max(sum(x$SPYearVal) * SolarLoad)
}))
## 1 2
## SubA 295 350
## SubB 180 170
## SubC 135 190
## SubD 145 190
colnames(HouseHoldLoad) <- c("Load.1", "Load.2")
HouseHoldLoad <- reshape(HouseHoldLoad, varying=c("Load.1", "Load.2"), direction="long", timevar="HouseHoldType")[1:2]
colnames(Solar_Panels) <- c("Customer", "SolarPanelYear.1", "SolarPanelYear.2")
Solar_Panels <- reshape(Solar_Panels, varying=c("SolarPanelYear.1", "SolarPanelYear.2"), direction="long", timevar="SolarPanelYear")[1:2]
colnames(Solar_Panels) <- c("Customer", "SPYearVal")
Solar_Panels$SolarPanelYear <- gsub("^[0-9]+\\.", "", rownames(Solar_Panels))
dat <- merge(Customer_Information, Solar_Panels, by="Customer")
rbind(by(dat, list(dat$SubSt_Nm, dat$SolarPanelYear), function(x) {
mx <- max(sum(x$SPYearVal) * SolarLoad)
}))
## 1 2
## SubA 295 350
## SubB 180 170
## SubC 135 190
## SubD 145 190