【问题标题】:Find common columns in two data frames and perform a function查找两个数据框中的公共列并执行一个函数
【发布时间】:2017-10-13 11:30:36
【问题描述】:

我有两个 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] 如果文件1中的行具有相同的年月日小时但不同的SN号,我将使用具有相同年月的行中的值,文件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

关于如何正确执行此操作的任何建议?

【问题讨论】:

    标签: r csv compare


    【解决方案1】:

    如果我没听错的话,你可以试试这个解决方案:

    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)
    

    【讨论】:

      猜你喜欢
      • 2013-09-18
      • 1970-01-01
      • 2011-05-11
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多