Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R “矢量化的正确方法”;查阅“;功能_R_Rstudio - Fatal编程技术网

R “矢量化的正确方法”;查阅“;功能

R “矢量化的正确方法”;查阅“;功能,r,rstudio,R,Rstudio,我正在寻找一种快速有效的方法来计算下面描述的问题。任何帮助都将不胜感激,提前感谢 我有两个非常大的csv文件,它们具有关于同一对象的不同信息,但在我的最终计算中,我需要不同表中的所有属性。我试图计算大量变电站的负荷,首先我有一个独特的变电站列表 Unique_Substations <- data.frame(Name = c("SubA", "SubB", "SubC", "SubD")) Customer_Information <- data.frame( Custome

我正在寻找一种快速有效的方法来计算下面描述的问题。任何帮助都将不胜感激,提前感谢

我有两个非常大的csv文件,它们具有关于同一对象的不同信息,但在我的最终计算中,我需要不同表中的所有属性。我试图计算大量变电站的负荷,首先我有一个独特的变电站列表

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