создать новый столбец для каждой строки, которая соответствует критерию R - PullRequest
0 голосов
/ 08 июля 2019

У меня есть два набора данных.У первого есть чье-то местоположение и расстояние в милях до разных направлений.Второй набор данных содержит список всех пунктов назначения.Я хочу, чтобы R сделал столбец, который вытягивает имя каждого пункта назначения, который находится на расстоянии менее 1000 миль.

Вот пример первого набора данных:

library(tidyverse)
start_location <- tibble(location = c("Anhui China", "Amersfoort Utrecht Netherlands", "Akita Akita Japan"),
lon = c(117.92, 5.38, 140.1),
lat = c(30.60, 52.16, 39.71),
dist_beijing = c(658, 5686, 1250),
dist_shanghai = c(241, 5510, 1200),
dist_tokyo = c(1300, 5775, 280),
dist_prague = c(5173, 417, 5415), 
dist_pomezia = c(5555, 474, 5927),
dist_antwerp = c(5498, 77, 5612))

Вот второй набор данных

library(tidyverse)
destinations <- tibble(destinations = c("beijing china", "shanghai china", "tokyo japan", "prague czech republic", "pomezia italy", "antwerp belgium"),
lon = c(116.4, 121.47, 139.65, 14.43, 12.50, 4.40),
lat = c(39.90, 31.23, 35.67, 50.07, 41.67, 51.22))

И вот как я хочу, чтобы набор данных выглядел следующим образом:

library(tidyverse)
solution <- tibble(location = c("Anhui China", "Amersfoort Utrecht Netherlands", "Akita Akita Japan"),
lon = c(117.92, 5.38, 140.1),
lat = c(30.60, 52.16, 39.71),
nearest1 = c("shanghai china", "antwerp belgium", "tokyo japan"),
nearest2 = c("beijing china", "prague czech republic", NA),
nearest3 = c(NA, "pomezia italy", NA))

Я знаю, как заставить его найти кратчайшее расстояние, но я изо всех сил стараюсь, чтобы он дал имя столбцадля каждого.Кроме того, хотя у этого было три ближайших, я не обязательно ограничиваю его только 3. Я просто хочу, чтобы он делал столбцы для каждого пункта назначения, который меньше 1000 миль.

Я предполагаю, что должен использовать case_whenи pmap, но я не могу понять, как добавить оператор if и разрешить ему создавать несколько столбцов.

Если он не может легко создавать столбцы, я также могу сделать так, чтобы в нем был один столбец со спискомвсе направления до 1000 миль по порядку (например, если «Пекин, Китай, Шанхай, Китай»), потому что тогда я мог бы, по крайней мере, выделить его с помощью тидира.

Также, если возможно, я бы хотелаккуратное решение, если это возможно.

Спасибо !!

1 Ответ

1 голос
/ 08 июля 2019

Вот решение по делу:

result<-start_location %>% gather("destination","distance",-(1:3)) %>%
  filter(distance<=1000) %>% 
  group_by(location) %>% 
  arrange(distance) %>% 
  mutate(id=paste0("nearest",row_number())) %>% 
  select(-5) 
result$destination<-gsub("dist_","",result$destination)
result$destination<-sapply(result$destination, function(x) grep(x,destinations$destinations,value=TRUE))
result<-result %>% spread(id, destination)

# A tibble: 3 x 6
# Groups:   location [3]
  location                     lon   lat nearest1       nearest2          nearest3   
  <chr>                      <dbl> <dbl> <chr>          <chr>             <chr>      
1 Akita Akita Japan         140.    39.7 tokyo japan    NA                NA         
2 Amersfoort Utrecht Nethe~   5.38  52.2 antwerp belgi~ prague czech rep~ pomezia it~
3 Anhui China               118.    30.6 shanghai china beijing china     NA 

Ключ заключается в расположении пунктов назначения (которые были сгруппированы по начальному расположению) по расстоянию, а затем в присвоении тега id в соответствии с их порядком - тогда вы можете spread пунктов назначения в столбцы на основе этих id тегов.

Я добавил пару шагов перед spread, чтобы заменить имена столбцов назначения действительными именами пунктов назначения из кадра данных destinations - это может привести к некоторым ошибкам, если у вас есть город назначения, который также является название страны (например, Мехико) и эта страна также появляется в другом пункте назначения, так что имейте это в виду.

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