루프에 대한 함수와 대안을 만드는 데 매우 익숙하지만 데이터 프레임에서 dplyr 함수 집합을 실행하려고합니다. 그러나 데이터 프레임은 송신기와 스테이션별로 분할해야합니다. 현재 중첩 된 for 루프를 사용하고 있지만 예상대로이 작업은 매우 오래 걸리고 효율적이지 않습니다. 내 데이터의 구조는 다음과 같습니다.
> str(example)
> str(Det17)
'data.frame': 43423 obs. of 3 variables:
$ DateTime : POSIXct, format: "2017-07-31 02:57:42" "2017-07-31 13:10:27" "2017-08-09 09:52:12" "2017-07-31 02:59:30" ...
$ Transmitter: Factor w/ 58 levels "1657","1658",..: 38 38 46 38 38 38 38 29 38 38 ...
$ Station : Factor w/ 41 levels "A0","A1","A2",..: 35 35 35 35 35 35 35 35 35 35 ...
>
내가 시도하고있는 코드는 다음과 같습니다.
for( i in Det17$Station){
for( j in Det17$Transmitter){
Example <- Det17%>%
filter(Station == i & Transmitter == j)%>%
arrange(DateTime)%>%
mutate(difftime = difftime(lead(DateTime),DateTime, tz = 'EST', units = 'secs'))%>%
filter(difftime < 30)
if(length(Example$difftime) > 0) {
print("TRUE")
} else {
next
}
}
}
기본적으로 스테이션 및 송신기 레벨의 모든 조합으로 데이터를 필터링하고 싶습니다. 데이터 프레임을 datetime별로 정렬하고 연속 된 두 시간의 차이 인 새 열을 추가하고 30 초 미만의 difftimes로 다시 필터링 한 다음 새 변수의 길이가 0보다 크면 "TRUE"를 인쇄합니다. 이상적으로는 I 어떤 조합이 "TRUE"의 결과를 낳았는지 알 수 있지만 아직 거기에 도달하지 못했습니다.
편집하다:
다음은 루프가 아닌 함수로서의 함수 그룹입니다.
function(x){
arrange(DateTime)%>%
mutate(difftime = difftime(lead(DateTime),DateTime, tz = 'EST', units = 'secs'))%>%
filter(difftime < 30)
if(length(Example$difftime) > 0) {
print("TRUE")
} else {
next
}
}
여기서 분할 기능이 유용합니다. 반복하려는 차원으로 데이터 프레임을 분할 할 수 있습니다.
DetSplit <- split(Det17, list(Det17$Station, Det17$Transmitter))
그런 다음 lapply 함수를 사용하여 결과 데이터 프레임 목록에 대해 하나씩 작업 할 수 있습니다.
DetProcessed <- lapply(DetSplit, my_function_name)
그런 다음 모두 함께 묶어
DetProcessed <- data.table::rbindlist(DetProcess)
별도의 개체로 나누는 대신 파이프를 사용하여이 작업을 수행 할 수도 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다