지역 찾기(Finding neighborhoods)
마지막 부분에서 우리는 Manhattan에 대한 shapefile을 mht_shapefile이라는 객체에 저장했습니다. 이 객체는 Manhattan 지역의 지도를 그리는 데 사용되었습니다. 이제 우리는 동일한 shapefile을 over 함수(sp 패키지의 일부)와 함께 사용하여 각각의 운행에 대하여 승차 및 하차 지역을 찾는 방법을 살펴 보겠습니다. 이전에 만들어 두었던 NYC 택시 데이터의 샘플을 사용하여 data.frame을 사용하여 이를 수행 할 수있는 방법을 보여주고, 코드를 변환 함수로 감싸고(wrap), 이를 XDF 데이터에 적용하기 위한 연습으로 남겨 둘 것입니다.
승차 지역 컬럼을 nyc_sample_df에 추가하려면 다음의 작업을 수행해야 합니다. pickup_latitude 및 pickup_longitude의 NA 값들을 0으로 바꿔야 하며, 바꾸지 않을 경우 오류가 발생합니다. coordinates 함수를 사용하여 위의 두 열이 데이터의 지리적 좌표를 나타내도록 지정합니다. over 함수를 사용하여 위에 지정된 좌표를 기반으로 한 지역 정보를 얻어서 지역 정보가 포함된 data.frame을 반환하게 합니다. 관련된 열 이름을 얻어낸 후, cbind를 사용하여 결과를 원래 데이터에 연결 시킵니다.
# 좌표 컬럼을 가져와서, NA를 0으로 치환함
data_coords <- transmute(nyc_sample_df,
long = ifelse(is.na(pickup_longitude), 0, pickup_longitude),
lat = ifelse(is.na(pickup_latitude), 0, pickup_latitude)
)
# 좌표에 해당하는 컬럼명을 지정함
coordinates(data_coords) <- c('long', 'lat')
# 좌표에 기반한 지역 정보를 반환
nhoods <- over(data_coords, mht_shapefile)
# nhoods의 열이름 바꿈
names(nhoods) <- paste('pickup', tolower(names(nhoods)), sep = '_')
# 원래 데이터에 지역정보를 추가함
nyc_sample_df <- cbind(nyc_sample_df, nhoods[, grep('name|city', names(nhoods))])
head(nyc_sample_df)
VendorID tpep_pickup_datetime tpep_dropoff_datetime passenger_count
1 2 2016-01-01 00:00:00 2016-01-01 00:00:00 2
2 2 2016-01-01 00:00:00 2016-01-01 00:00:00 5
3 2 2016-01-01 00:00:00 2016-01-01 00:00:00 1
4 2 2016-01-01 00:00:00 2016-01-01 00:00:00 1
5 2 2016-01-01 00:00:00 2016-01-01 00:00:00 3
6 2 2016-01-01 00:00:00 2016-01-01 00:18:30 2
trip_distance pickup_longitude pickup_latitude RatecodeID store_and_fwd_flag
1 1.10 -73.99037 40.73470 1 N
2 4.90 -73.98078 40.72991 1 N
3 10.54 -73.98455 40.67957 1 N
4 4.75 -73.99347 40.71899 1 N
5 1.76 -73.96062 40.78133 1 N
6 5.52 -73.98012 40.74305 1 N
dropoff_longitude dropoff_latitude payment_type fare_amount extra mta_tax
1 -73.98184 40.73241 2 7.5 0.5 0.5
2 -73.94447 40.71668 1 18.0 0.5 0.5
3 -73.95027 40.78893 1 33.0 0.5 0.5
4 -73.96224 40.65733 2 16.5 0.0 0.5
5 -73.97726 40.75851 2 8.0 0.0 0.5
6 -73.91349 40.76314 2 19.0 0.5 0.5
tip_amount tolls_amount improvement_surcharge total_amount
1 0 0 0.3 8.8
2 0 0 0.3 19.3
3 0 0 0.3 34.3
4 0 0 0.3 17.3
5 0 0 0.3 8.8
6 0 0 0.3 20.3
pickup_city pickup_name
1 New York City-Manhattan Greenwich Village
2 New York City-Manhattan East Village
3 <NA> <NA>
4 New York City-Manhattan Lower East Side
5 New York City-Manhattan Upper East Side
6 New York City-Manhattan Gramercy
전체 데이터에 대하여 위의 변환을 실행하려면, 위 코드를 transfromFunc 인수를 통해 rxDataStep에 ���달할 수 있도록 변환 함수로 래핑해야 합니다. 우리는 변환 함수 find_nhoods를 호출하는 것입니다. 우리가 작성한 변환 함수는 탑승 지역과 구역 그리고 하차 지역과 구역을 모두 추가합니다.
find_nhoods <- function(data) {
# 승차 위도와 경도를 추출하고, 해당 지역 정보를 조회함
pickup_longitude <- ifelse(is.na(data$pickup_longitude), 0, data$pickup_longitude)
pickup_latitude <- ifelse(is.na(data$pickup_latitude), 0, data$pickup_latitude)
data_coords <- data.frame(long = pickup_longitude, lat = pickup_latitude)
coordinates(data_coords) <- c('long', 'lat')
nhoods <- over(data_coords, shapefile)
## 데이터에 승차 지역 및 도시 컬럼 추가
data$pickup_nhood <- nhoods$NAME
data$pickup_borough <- nhoods$CITY
# 하차 위도와 경도를 추출하고, 해당 지역 정보를 조회함
dropoff_longitude <- ifelse(is.na(data$dropoff_longitude), 0, data$dropoff_longitude)
dropoff_latitude <- ifelse(is.na(data$dropoff_latitude), 0, data$dropoff_latitude)
data_coords <- data.frame(long = dropoff_longitude, lat = dropoff_latitude)
coordinates(data_coords) <- c('long', 'lat')
nhoods <- over(data_coords, shapefile)
## 데이터에 하차 지역 및 도시 컬럼 추가
data$dropoff_nhood <- nhoods$NAME
data$dropoff_borough <- nhoods$CITY
## 새 컬럼이 추가된 데이터 반환
data
}
이제 우리는 함수를 만들었으므로, 테스트를 진행할 차례입니다. 샘플 데이터 nyc_sample_df에서 rxDataStep을 실행하여 테스트를 수행합니다. 이러한 방식은, 큰 XDF 파일 nyc_xdf에서 변환을 실행하기에 앞서 변환이 제대로 작동하는지 확인하는 데 있어서 매우 좋은 방법입니다. data.frame에 변환을 적용하면서 얻는 오류 메시지는, 때로는 XDF에서 보다 더 많은 정보를 제공하기 때문에, 오류를 추적하고 디버깅하는 것이 더 쉽습니다. 이제 rxDataStep을 사용하여 nyc_sample_df(outFile 인수 없음)를 대상으로 변환 함수 find_nhoods를 적용한 이후 데이터가 어떻게 보이는지를 살펴봅시다.
# rxDataStep을 사용하여 data.frame에 변환 함수 테스트
head(rxDataStep(nyc_sample_df, transformFunc = find_nhoods, transformPackages = c("sp", "maptools"),
transformObjects = list(shapefile = mht_shapefile)))
VendorID tpep_pickup_datetime tpep_dropoff_datetime passenger_count trip_distance
1 2 2016-01-01 00:00:00 2016-01-01 00:00:00 2 1.10
2 2 2016-01-01 00:00:00 2016-01-01 00:00:00 5 4.90
3 2 2016-01-01 00:00:00 2016-01-01 00:00:00 1 10.54
4 2 2016-01-01 00:00:00 2016-01-01 00:00:00 1 4.75
5 2 2016-01-01 00:00:00 2016-01-01 00:00:00 3 1.76
6 2 2016-01-01 00:00:00 2016-01-01 00:18:30 2 5.52
pickup_longitude pickup_latitude RatecodeID store_and_fwd_flag dropoff_longitude
1 -73.99037 40.73470 1 N -73.98184
2 -73.98078 40.72991 1 N -73.94447
3 -73.98455 40.67957 1 N -73.95027
4 -73.99347 40.71899 1 N -73.96224
5 -73.96062 40.78133 1 N -73.97726
6 -73.98012 40.74305 1 N -73.91349
dropoff_latitude payment_type fare_amount extra mta_tax tip_amount tolls_amount
1 40.73241 2 7.5 0.5 0.5 0 0
2 40.71668 1 18.0 0.5 0.5 0 0
3 40.78893 1 33.0 0.5 0.5 0 0
4 40.65733 2 16.5 0.0 0.5 0 0
5 40.75851 2 8.0 0.0 0.5 0 0
6 40.76314 2 19.0 0.5 0.5 0 0
improvement_surcharge total_amount pickup_nhood pickup_borough
1 0.3 8.8 Greenwich Village New York City-Manhattan
2 0.3 19.3 East Village New York City-Manhattan
3 0.3 34.3 Boerum Hill New York City-Brooklyn
4 0.3 17.3 Lower East Side New York City-Manhattan
5 0.3 8.8 Upper East Side New York City-Manhattan
6 0.3 20.3 Gramercy New York City-Manhattan
dropoff_nhood dropoff_borough
1 Gramercy New York City-Manhattan
2 <NA> <NA>
3 Yorkville New York City-Manhattan
4 <NA> <NA>
5 Midtown New York City-Manhattan
6 Astoria-Long Island City New York City-Queens
데이터의 마지막 4개 열은 우리가 원하는 지역 정보 열에 해당합니다. 따라서 우리는 nyc_xdf에서 실행을 해도, 변환이 잘 작동할 것임을 확신할 수 있습니다.
st <- Sys.time()
rxDataStep(nyc_xdf, nyc_xdf, overwrite = TRUE, transformFunc = find_nhoods, transformPackages = c("sp", "maptools", "rgeos"),
transformObjects = list(shapefile = mht_shapefile))
Sys.time() - st
rxGetInfo(nyc_xdf, numRows = 5)
Time difference of 30.77251 mins
File name: C:\Data\NYC_taxi\yellow_tripdata_2016.xdf
Number of observations: 69406520
Number of variables: 29
Number of blocks: 141
Compression type: zlib
Data (5 rows starting with row 1):
VendorID tpep_pickup_datetime tpep_dropoff_datetime passenger_count trip_distance
1 2 2016-01-01 00:00:00 2016-01-01 00:00:00 2 1.10
2 2 2016-01-01 00:00:00 2016-01-01 00:00:00 5 4.90
3 2 2016-01-01 00:00:00 2016-01-01 00:00:00 1 10.54
4 2 2016-01-01 00:00:00 2016-01-01 00:00:00 1 4.75
5 2 2016-01-01 00:00:00 2016-01-01 00:00:00 3 1.76
pickup_longitude pickup_latitude RatecodeID store_and_fwd_flag dropoff_longitude
1 -73.99037 40.73470 1 N -73.98184
2 -73.98078 40.72991 1 N -73.94447
3 -73.98455 40.67957 1 N -73.95027
4 -73.99347 40.71899 1 N -73.96224
5 -73.96062 40.78133 1 N -73.97726
dropoff_latitude payment_type fare_amount extra mta_tax tip_amount tolls_amount
1 40.73241 2 7.5 0.5 0.5 0 0
2 40.71668 1 18.0 0.5 0.5 0 0
3 40.78893 1 33.0 0.5 0.5 0 0
4 40.65733 2 16.5 0.0 0.5 0 0
5 40.75851 2 8.0 0.0 0.5 0 0
improvement_surcharge total_amount tip_percent pickup_hour pickup_dow
1 0.3 8.8 0 10PM-1AM Fri
2 0.3 19.3 0 10PM-1AM Fri
3 0.3 34.3 0 10PM-1AM Fri
4 0.3 17.3 0 10PM-1AM Fri
5 0.3 8.8 0 10PM-1AM Fri
dropoff_hour dropoff_dow trip_duration pickup_nhood pickup_borough
1 10PM-1AM Fri 0 Greenwich Village New York City-Manhattan
2 10PM-1AM Fri 0 East Village New York City-Manhattan
3 10PM-1AM Fri 0 Boerum Hill New York City-Brooklyn
4 10PM-1AM Fri 0 Lower East Side New York City-Manhattan
5 10PM-1AM Fri 0 Upper East Side New York City-Manhattan
dropoff_nhood dropoff_borough
1 Gramercy New York City-Manhattan
2 <NA> <NA>
3 Yorkville New York City-Manhattan
4 <NA> <NA>
5 Midtown New York City-Manhattan