문자 배열을 기반으로 다른 함수 (fn1
)를 호출하는 아래 함수 (fndf
)의 속도를 높이고 싶습니다.성능 향상을 위해`for` 루프 대신`apply/lapply/sapply`를 어떻게 사용할 수 있습니까?
fndf
- 새로운 함수
list_s
- 문자 배열 - chr [1:400]
rdata_i
- 빈 데이터 프레임 (초기화)
fn1
- 다른 커스텀 기능
rdata2
-3000 obs of 40 variables
mdata
와 데이터 프레임 - data.frame
nm
- 문자
fndf = function(list_s, rdata2){
rdata_i = df <- data.frame(Date=as.Date(character()),
File=character(),
User=character(),
stringsAsFactors=FALSE)
for(i in 1:length(list_s))
{
rdata = fn1(list_s[i], rdata2)
rdata_i = rbind(rdata, rdata_i)
}
return(unique(rdata_i))
}
function
의 성능을 향상시킬 수 있습니까?
fn1 = function(nm, mdata){
n0 = mdata[mdata$Sign==nm,]
cn0 = unique(c(n0$Name))
repeat{
n1c = mdata[mdata$Mgr %in% cn0,]
n0 = unique(rbind(n0,n1c))
if(nrow(n1c)==0){
return(n0)
break
}
cn0= unique(c(n1c$Name))
}
}
당신의 둔화는 아마도'rdata_i = rbind (rdata, rdata_i)'때문일 것입니다; 일반적으로 for 루프에서 객체를 성장시키는 것은 나쁜 습관입니다 (너무 많은 복사 및 데이터 이동). "R Inferno"책을 확인해보십시오.이 책에 대한 조언이 있습니다. – baptiste
이것을 시도해 보면,'ld = lapply (list_s, fn1, rdata2); do.call (rbind, ld)' – baptiste
질문을 재현 가능하게 만들어야합니다. 아마도 루프가 필요하지 않을 수도 있습니다. – Roland