Сопоставьте два фрейма данных по общему лату, длинной паре и создайте из него новый столбец - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть два кадра данных с координатами:

lat<-c(36.09163,36.16152,36.13027
,36.24514)
lon<-c(-95.84311,-95.83745
,-96.10115,-95.84191)
weight<-c(87,45,656,78)
df1<-data.frame(lat,lon,weight)



lat<-c(36.09163,36.16152,36.130279,36.24514)
lon<-c(-95.84311,-95.83745
       ,-96.101159,-95.841919)
df2<-data.frame(lat,lon)

Чего я хочу добиться, так это найти все общие пары длинных лат, когда у них обоих есть хотя бы 5 общих десятичных цифр (и, конечно, целое число) слат-длинная пара другого информационного кадра.Когда это происходит, второй кадр данных должен принимать относительное значение weight 1-го кадра данных в новом столбце с именем weight.В примере с игрушкой, который я привожу, все пары должны считаться одинаковыми.Если нет, то новое значение веса должно быть равно 0. Мне нужно что-то вроде:

n<-merge(df1,df2,all.x=TRUE)

, но я не знаю, как справиться с проблемой цифр, так как некоторые координаты имеют 5, а другие имеют 6 цифр.

1 Ответ

0 голосов
/ 22 декабря 2018

Пакет sqldf может быть полезен здесь, так как ваша проблема может быть аккуратно сформулирована с помощью SQL-соединения между двумя фреймами данных:

library(sqldf)

sql <- "SELECT df2.lat, df2.lon, COALESCE(df1.weight, 0) weight
        FROM df2
        LEFT JOIN df1
            ON ROUND(df1.lat - 0.5, 5) = ROUND(df2.lat - 0.5, 5) AND
               ROUND(df1.lon - 0.5, 5) = ROUND(df2.lon - 0.5, 5)"

df2 <- sqldf(sql)

Обратите внимание, что вы хотите усечь каждое значение широты / долготы и затем сравнить его.То есть следующие два значения широты из двух фреймов данных должны считаться эквивалентными:

36.130279
36.13027

Мы можем сделать это, укоротив до 5 цифр, а затем сравнив.Поскольку SQLite не имеет функции floor, мы можем имитировать, вычитая 0.5, а затем округляя до 5 цифр.

Кроме того, если данная пара lat / lng может соответствовать более чем одной паре в других данныхframe, тогда ваш текущий вопрос не очень хорошо определен, и вам нужно будет предоставить другую логику, чтобы справиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...