아래에서 설명하는 문제를 신속하고 효율적으로 처리 할 방법을 찾고 있습니다. 어떤 도움을 주셔서 감사합니다, 미리 감사드립니다!"조회"함수를 벡터화하는 올바른 방법
동일한 개체에 대해 서로 다른 정보를 가진 두 개의 매우 큰 CSV 파일이 있지만 최종 계산에는 다른 테이블의 모든 특성이 필요합니다. 나는 많은 수의 전기 변전소의 부하를 계산하려고한다. 먼저 고유 한 전기 변전소 목록을 가지고있다.
Unique_Substations <- data.frame(Name = c("SubA", "SubB", "SubC", "SubD"))
다른 목록에는이 변전소의 고객에 대한 정보가 있습니다.
그리고 또 다른 목록에는이 고객의 지붕에 대한 정보 (다른 해에 대한)가 있습니다.
Solar_Panels <- data.frame(
Customer = sample(1001:1010, 10, replace = TRUE),
SolarPanelYear1 = sample(10:20, 10, replace = TRUE),
SolarPanelYear2 = sample(15:20, 10, replace = TRUE)
)
이제 매년 각 변전소의 부하를 확인하고 싶습니다. 나는 가정용 또는 태양 전지판의 각 유형에 대해 표준화 된 가정용 부하 및 태양 전지판 부하를 가지고 있습니다.
SolarLoad <- data.frame(Load = c(0, -10, -10, 5))
HouseHoldLoad <- data.frame(Type1 = c(1, 3, 5, 2), Type2 = c(3, 5, 6, 1))
이제 이러한 목록을 일치시켜야합니다. 나는 여러 일치를 필요 match()
단 하나의 일치
을 반환 그리고 지금 우리가 내 큰 질문에 와서 (그러나 때문에 여기
ML_SubSt_Cust <- sapply(Unique_Substations$Name,
function(x) which(Customer_Information$SubSt_Nm %in% x == TRUE))
ML_Cust_SolarP <- sapply(Customer_Information$Customer,
function(x) which(Solar_Panels$Customer %in% x == TRUE))
은 (내가 which(xxx %in% x == TRUE)
방법을 사용하여 마지막에이 방법 아마 내 유일한 문제) . 나는 매년 각 변전소의 최대 부하를 계산하고 싶다.이 목적을 위해 Unique_Substations 목록을 반복하는 for 루프를 처음 작성했는데 물론 비효율적이다. 그 후 outer()
을 사용하여 속도를 높이려고했지만 내 함수를 적절하게 벡터화했다고 생각하지 않는다. 최대 기능은 다음과 같다 (나는 태양 전지판 부분을 위해서만 써야한다. 간단하게);
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))
모든 프레임은 훨씬 더 큰 (40000 행 각 정도), 그래서 정말 관련된 기능의 좋은 최적화가 필요합니다. 나는 함수를 벡터화하는 방법을 생각하려고 노력했지만 그것을 해결하지 못했습니다. 어떤 도움을 주시면 감사하겠습니다.
편집 : 나는 완전히 내가 또 다른 문제가 허용 awnser을 이해 이제
. 내 실제 Customer_Information
길이가 188k 행이며 실제 내 HouseHoldLoad
길이는 53k 행입니다. 말할 필요도없이 이것은 merge()
이 아닙니다. 이 문제에 대한 또 다른 해결책이 merge()
을 필요로하지 않거나 너무 느린 루프를 위해 있습니까?
한 가지 예로 데이터 유형이 하나뿐이기 때문에 'data.frames'가 필요하지 않습니다. 각 개체. 벡터와 행렬이면 충분합니다. 다음으로'which (foo % bar == TRUE)'보다는'which (bar == foo)'(여기서'foo'는 스칼라이고'bar'는 벡터 또는 행렬입니다. –
@CarlWitthoft'which (foo % in % bar == TRUE)'는'which (bar == foo)'가 아닌'which (foo % bar) '와 동일합니다. 'bar = c (0,1)'과'foo = c (1,0)'을 취하면 그 차이는 명백합니다. 나는'foo'가 하나의 요소만을 포함하고있을 때도 사용할 수 있다는 것에 동의하지만 그것들은 동일하지 않습니다. –
@JorisMeys 감사합니다 - 좋은 지적 –