Разделить фрейм данных: сохранить верхние значения и сгруппировать самые низкие значения - PullRequest
1 голос
/ 02 апреля 2020

У меня есть датафрейм с портами и n рейсами:

library(dplyr)

ports <- c("Nantes", "Bordeaux", "Liverpool", "Bayonne", "Brest", "Bristol")
n <- c(47, 78, 45, 1, 1, 2)

ports_n <- data.frame(ports, n)

Вот мой вывод:

      ports  n
 1    Nantes 47
 2  Bordeaux 78
 3 Liverpool 45
 4   Bayonne  1
 5     Brest  1
 6   Bristol  2

Что я хочу: сгруппировать все значения <= 2 в группу называется "другие" с пакетом dplyr. </p>

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

     ports  n
 1    Nantes 47
 2  Bordeaux 78
 3 Liverpool 45
 4    Others  4

Что я пробовал:

top_ports <- ports_n %>%
 filter(n>1)

minor_ports <- ports_n %>%
filter(n <=2)

Ответы [ 2 ]

3 голосов
/ 02 апреля 2020

Вы можете изменить значение в ports на 'others', где n <= 2, а затем сгруппировать и sum.

library(dplyr)

ports_n %>%
  mutate(ports = replace(ports, n <= 2, 'others')) %>%
  group_by(ports) %>%
  summarise(n = sum(n))

# A tibble: 4 x 2
#  ports         n
#  <chr>     <dbl>
#1 Bordeaux     78
#2 Liverpool    45
#3 Nantes       47
#4 others        4

Или используя тот же лог c в базе R:

aggregate(n~ports, transform(ports_n, 
         ports = replace(ports, n <= 2, 'others')), sum)

data

Считать данные в виде символов.

ports_n <- data.frame(ports, n, stringsAsFactors = FALSE)
0 голосов
/ 02 апреля 2020

Другой вариант dplyr может быть:

ports_n %>%
 filter(n > 2) %>%
 add_row(ports = "Others", n = sum(ports_n$n[ports_n$n <= 2]))

      ports  n
1    Nantes 47
2  Bordeaux 78
3 Liverpool 45
4    Others  4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...