2017-10-13 1 views
0

4 개의 조건이 만족되면 함수/계산을 수행하고 비교할 두 개의 CSV 파일이 있습니다.두 개의 데이터 프레임에서 공통 열을 찾고 함수를 수행하십시오.

파일 1 :

SN CY Year Month Day Hour Lat Lon 
196101 1 1961 1 14 12 8.3 134.7 
196101 1 1961 1 14 18 8.8 133.4 
196101 1 1961 1 15 0 9.1 132.5 
196101 1 1961 1 15 6 9.3 132.2 
196101 1 1961 1 15 12 9.5 132 
196101 1 1961 1 15 18 9.9 131.8 
196125 1 1961 1 14 12 10.0 136 
196125 1 1961 1 14 18 10.5 136.5 

파일 2 : 나는 위도 - 경도 사이의 거리들이 같은 년, 월, 일있을 때마다이 두 파일에서 포인트를 계산하기 위해 노력하고

Year Month Day RR Hour Lat Lon 
1961 1 14 0 0 14.0917 121.055 
1961 1 14 0 6 14.0917 121.055 
1961 1 14 0 12 14.0917 121.055 
1961 1 14 0 18 14.0917 121.055 
1961 1 15 0 0 14.0917 121.055 
1961 1 15 0 6 14.0917 121.055 

, 시간은입니다. 여기 내 코드는 다음과 같습니다.

jtwc <-read.csv("file1.csv",header=T,sep=",") 
stn <-read.csv("file2.csv",header=T,sep=",") 

dms_to_rad <- function(d, m, s) (d + m/60 + s/3600) * pi/180 
great_circle_distance <- function(lat1, long1, lat2, long2) { 
    a <- sin(0.5 * (lat2 - lat1)) 
    b <- sin(0.5 * (long2 - long1)) 
    12742 * asin(sqrt(a * a + cos(lat1) * cos(lat2) * b * b)) 
} 

jtwc$dist<- great_circle_distance(dms_to_rad(jtwc$Lat,0,0),dms_to_rad(jtwc$Lon,0,0),dms_to_rad(stn$Lat,0,0),dms_to_rad(stn$Lon,0,0)) 
write.csv(stn,file="dist.csv",row.names=T) 

"SN"열은 file1의 고유 식별자입니다. 내가 원하는 작업 :

[1] 두 파일의 연도, 월, 일 및 시간이 같을 때의 거리 (jtwc $ dist)를 계산합니다.

[2] 행이 같은 연도, 월, 일 및 시간을 가지지 만 SN 번호가 인 파일 1에있는 경우 동일한 연도, 월, 일 및 시간을 가진 행의 값을 사용합니다 거리를 계산할 때 파일 2에서.

출력이 좋아한다 :

SN CY Year Month Day Hour Lat Lon dist 
196101 1 1961 1 14 12 8.3 134.7 1620.961 
196101 1 1961 1 14 18 8.8 133.4 1467.859 
196101 1 1961 1 15 0 9.1 132.5 1334.382 
196101 1 1961 1 15 6 9.3 132.2 1324.915 
196125 1 1961 1 14 12 10.0 136 1687.127 
196125 1 1961 1 14 18 10.5 136.5 1724.351 

제대로이 작업을 수행하는 방법에 대한 제안을?

답변

2

내가 바로 당신을 이해한다면, 당신은이 솔루션을 시도 할 수 있습니다 : 도움을

library(tidyverse) 
#functions 
dms_to_rad <- function(d, m, s) (d + m/60 + s/3600) * pi/180 
great_circle_distance <- function(lat1, long1, lat2, long2) { 
    a <- sin(0.5 * (lat2 - lat1)) 
    b <- sin(0.5 * (long2 - long1)) 
    12742 * asin(sqrt(a * a + cos(lat1) * cos(lat2) * b * b)) 
} 

#read file 
dir1 = 'path_to_your_files' 
dir1 = 'path_to_your_files' 
jtwc <- read.csv(dir1) %>% 
    unite('key',c('Year','Month','Day','Hour')) 
stn <- read.csv(dir2) %>% 
    unite('key',c('Year','Month','Day','Hour')) 

#aggregating 
stn <- left_join(jtwc,stn,by = 'key') %>% 
     drop_na() %>% 
     mutate_at(vars(Lat.x,Lon.x, Lat.y,Lon.y),funs(dms_to_rad),m = 0,s =0) %>% 
     mutate(dist = great_circle_distance(Lat.x,Lon.x, Lat.y,Lon.y)) 


write.csv(stn,file="dist.csv",row.names=T) 
+0

많은 감사를! – Lyndz

관련 문제