#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:
left_join
фреймы данных поcode
group_by
name
- использовать
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. Большое спасибо, вы думаете, есть ли какой-нибудь способ сделать это без добавления имен в выходной фрейм данных?