Приведите в порядок строки в одном фрейме данных на основе условия

#r #dataframe

#r #фрейм данных

Вопрос:

У меня есть вопрос по программированию на языке R.

У меня есть фрейм данных в R со следующими данными:

 Country         Year           Population        Bikes         Revenue
Austria          1970             85               NA            NA
Austria          1973             86               NA            NA
AUSTRIA          1970             NA               56           4567
AUSTRIA          1973             NA               54           4390
  

Я хочу обобщить эти данные, чтобы получить следующие новые данные:

 Country             Year            Population         Bikes      Revenue
Austria             1970               85               56         4567
Austria             1973               86               54         4390
  

Таким образом, мне нужно исключить повторяющиеся годы для каждой страны и объединить столбцы Bikes и Revenue с конкретным годом и страной.

Я был бы очень признателен, если бы вы могли помочь мне с этим вопросом.

Спасибо.

Ответ №1:

Одной dplyr возможностью может быть:

 df %>%
 group_by(Country = toupper(Country), Year) %>%
 summarise_all(list(~ sum(.[!is.na(.)])))

  Country  Year Population Bikes Revenue
  <chr>   <int>      <int> <int>   <int>
1 AUSTRIA  1970         85    56    4567
2 AUSTRIA  1973         86    54    4390
  

Или комбинация dplyr и tidyr :

 df %>%
 group_by(Country = toupper(Country), Year) %>%
 fill(everything(), .direction = "up") %>%
 fill(everything(), .direction = "down") %>%
 distinct()
  

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

 df %>%
 mutate(Country = tolower(Country),
        Country = paste0(toupper(substr(Country, 1, 1)), substr(Country, 2, nchar(Country)))) %>%
 group_by(Country, Year) %>%
 summarise_all(list(~ sum(.[!is.na(.)])))

  Country  Year Population Bikes Revenue
  <chr>   <int>      <int> <int>   <int>
1 Austria  1970         85    56    4567
2 Austria  1973         86    54    4390
  

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

1. Вау, это действительно сработало. Большое вам спасибо! Я высоко ценю!!

2. Да, все работает идеально. Я очень благодарен за все предоставленные вами варианты. Я очень ценю вашу помощь 🙂

3. Если вы считаете этот пост полезным, пожалуйста, примите его 🙂