мутировать, чтобы объединить минимальное значение из разных df в R

#r #join #merge #tidyverse #data-cleaning

Вопрос:

У меня есть два набора данных: один из видов в моем исследовании и то, сколько раз я их наблюдал, и другой более крупный набор данных, который представляет собой более широкую базу данных наблюдений.

Я хочу изменить столбец в моем коротком наборе данных для «самой низкой наблюдаемой широты» (или самой высокой или средней) из значений в другом наборе данных, но я не могу понять, как сопоставить их при изменении.

 set.seed(1)
# my dataset. sightings isn't important for this, just important that the solution doesn't mess up existing columns. 
fake_spp_df <- data.frame(
  species = c("a","b","c","d",'e'),
  sightings = c(5,1,2,6,3)
) 

# broader occurrence dataset
fake_spp_occurrences <- data.frame(
  species = rep(c("a","b","c","d",'f'),each=20), # notice spp "f" - not all species are the same between datasets
  latitude = runif(100, min = 0, max = 80),
  longitude = runif(100, min=-90, max = -55)
)


# so I know to find one species min, i could do this:
min(fake_spp_occurrences$latitude[fake_spp_occurrences$species == "a"]),
# but I want to do that in a mutate()

# this was my failed attempt:
fake_spp_df %>%
  mutate(lowest_lat = min(fake_spp_occurrences$latitude[fake_spp_occurrences$species == species])
)

 

желаемый результат:

 > fake_spp_df

  species sightings lowest_lat  max_lat  median_lat
1       a         5     1.7      etc...
2       b         1     5.3
3       c         2     2.2
4       d         6     4.3
5       e         3     NA
 

думаю, что это также можно было бы сделать с помощью какого-то объединения или слияния, но я не уверен.

Спасибо!

Ответ №1:

summarise fake_spp_occurrences набор данных, а затем выполните объединение.

 library(dplyr)

fake_spp_occurrences %>%
  group_by(species) %>%
  summarise(lowest_lat = min(latitude), 
            max_lat = max(latitude), 
            median_lat = median(latitude)) %>%
  right_join(fake_spp_df, by = 'species')

#  species lowest_lat max_lat median_lat sightings
#  <chr>        <dbl>   <dbl>      <dbl>     <dbl>
#1 a             4.94    79.4       48.1         5
#2 b             1.07    74.8       35.7         1
#3 c             1.87    68.9       41.9         2
#4 d             6.74    76.8       38.2         6
#5 e            NA       NA         NA           3