Есть ли какой-нибудь короткий способ в R найти минимальный максимум на основе приведенных ниже данных?

#r #dataframe #function #range

Вопрос:

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

 code | name
115  | A
120  | B
125  | A
130  | C
140  | A
 

Второй такой:

 code | Year
115  | 2015
140  | 2020
120  | 2017
130  | 2019
125  | 2011
 

Основываясь на столбце «код», я хочу найти диапазон года для каждого имени следующим образом:

 code | Year | Range
115  | 2015 | 9
140  | 2020 | 9
120  | 2017 | 0
130  | 2019 | 0
125  | 2011 | 9
 

На самом деле 9-это 2020-2011 годы

Моя цель-написать функцию с минимальным количеством циклов для быстрой работы с большим количеством данных.

Комментарии:

1. Извините, я не понимаю ожидаемого результата, не могли бы вы уточнить? Почему 120 и 130 равны нулю?

2. Оба показанных ответа могут быть правильным решением, но в основном это обоснованные предположения. Пожалуйста, проясните свой вопрос.

Ответ №1:

Я думаю, что вы хотите сначала объединить фреймы данных:

 data<-merge(df1, df2, by = 'code')
 

Затем вам нужен диапазон столбца «Год», сгруппированный по коду:

 library(dplyr)

data %>% group_by(name) %>% mutate(Range=diff(range(Year)))
 

Все это можно сделать за один звонок:

 library(dplyr)

merge(df1, df2, by = 'code')%>%
group_by(name)%>%
mutate(Range=diff(range(Year)))

   code  Year name  Range
  <dbl> <dbl> <chr> <dbl>
1   115  2015 A         9
2   140  2020 A         9
3   120  2017 B         0
4   130  2019 C         0
5   125  2011 A         9
 

Комментарии:

1. Спасибо миллиону, вы думаете, есть ли какой-нибудь способ сделать это без добавления имен в выходной фрейм данных?

2. Просто вызовите «%>%select(-имена) » в конце

Ответ №2:

  1. left_join фреймы данных по code
  2. group_by name
  3. использовать max и min
 df <- tribble(
~code, ~name,
115, "A",
120, "B",
125, "A",
130, "C",
140, "A")

df1 <- tribble(
~code, ~Year,
115, 2015,
140, 2020,
120, 2017,
130, 2019,
125, 2011)

df2 <- df1 %>% 
  left_join(df, by="code") %>% 
  group_by(name) %>% 
  mutate(Range = max(Year) - min(Year)) %>%
  select(-name)
df2

 

Выход:

    code  Year name  Range
  <dbl> <dbl> <chr> <dbl>
1   115  2015 A         9
2   140  2020 A         9
3   120  2017 B         0
4   130  2019 C         0
5   125  2011 A         9
 

Комментарии:

1. Большое спасибо, вы думаете, есть ли какой-нибудь способ сделать это без добавления имен в выходной фрейм данных?