Я пытаюсь оптимизировать мой код R, удаляя вложенные для l oop с векторизацией. Мой вложенный для l oop включает rbind в зависимости от условия if. Вложенный для l oop код работает, однако, при запуске векторизованного кода с использованием rbind не заполняет новый фрейм данных.
Для фона у меня есть два dataframes-'ip ',' ip_error '. Фрейм данных 'ip' с измерением '469 5'. Фрейм данных 'ip_error' имеет размерность '9 11'. После сравнения двух фреймов данных в указанных столбцах c начала и конца задачи с началом и концом сеанса мои выходные данные представляют собой выбранные строки из фрейма данных 'ip'.
Это мой рабочий код с вложенным для l oop
for(j in 1:length(ip$RUID_KEY)){
for(i in 1:length(ip_error$RUID_KEY)){
if(isTRUE(ip_error$RUID_KEY[i]==ip$RUID_KEY[j]&&ip_error$TASK_START[i]>=ip$sess_start[j]&&ip_error$TASK_END[i]<ip$sess_end[j])){
ev_ip_error<-rbind(ev_ip_error,ip[j,])
}
}
}
Мой код с векторизацией выглядит следующим образом, который не работает
al<-1:length(ip$RUID_KEY)
bl<-1:length(ip_error$RUID_KEY)
f<- function(i,j){
if(isTRUE(ip_error$RUID_KEY[i]==ip$RUID_KEY[j]&&ip_error$TASK_START[i]>=ip$sess_start[j]&&ip_error$TASK_END[i]<ip$sess_end[j])){
ev_ip_error<-rbind(ev_ip_error,ip[j,])
}
}
mapply(f,al,bl)
Вот пример моих фреймов данных, где для строк 1 и 3 в 'ip_error' удовлетворяет условию if
No. RUID_KEY sess_start sess_end
1 101 2018-12-01 22:48:18.827 2018-12-01 22:55:18.900
2 201 2018-12-01 13:10:20.100 2018-12-01 13:50:10.000
3 201 2018-12-12 11:10:10.100 2018-12-12 11:20:00.100
фрейм данных 'ip_error'
No. RUID_KEY TASK_START TASK_END TASK_NAME
1 101 2018-12-01 22:50:18.827 2018-12-01 22:50:18.827 ERROR1
2 101 2018-12-01 15:10:20.100 2018-12-01 15:10:20.100 ERROR2
3 201 2018-12-01 13:40:10.100 2018-12-01 13:40:10.100 ERROR1
ev_ip_error<-data.frame(matrix(ncol=5,nrow=0))
x<-c("RUID_KEY", "sess_start", "sess_end")
colnames(ev_ip_error)<-x