Я пытаюсь разбить непрерывную переменную на интервалы, варьируя значение сокращения в зависимости от группы наблюдения. Был аналогичный вопрос задан ранее, но он имел дело только с одним столбцом, в то время как я хотел найти решение, которое можно было бы обобщить для работы с функцией group_by() в dplyr, которая позволяет выбирать несколько столбцов для группировки.
Вот базовый пример набора данных:
df <- data.frame(group = c(rep("Group 1", 10),
rep("Group 2", 10)),
subgroup = c(1,2),
value = 1:20)
создает:
group subgroup value
1 Group 1 1 1
2 Group 1 2 2
3 Group 1 1 3
4 Group 1 2 4
5 Group 1 1 5
6 Group 1 2 6
7 Group 1 1 7
8 Group 1 2 8
9 Group 1 1 9
10 Group 1 2 10
11 Group 2 1 11
12 Group 2 2 12
13 Group 2 1 13
14 Group 2 2 14
15 Group 2 1 15
16 Group 2 2 16
17 Group 2 1 17
18 Group 2 2 18
19 Group 2 1 19
20 Group 2 2 20
Для целей этого вопроса давайте предположим, что мы хотим разбить группы на значение 1 или 2, в зависимости от того, выше или ниже это значение среднего значения группы. Группировка должна выполняться group и subgroup с ожидаемым результатом:
group subgroup value cut
1 Group 1 1 1 1
2 Group 1 2 2 1
3 Group 1 1 3 1
4 Group 1 2 4 1
5 Group 1 1 5 1
6 Group 1 2 6 2
7 Group 1 1 7 2
8 Group 1 2 8 2
9 Group 1 1 9 2
10 Group 1 2 10 2
11 Group 2 1 11 1
12 Group 2 2 12 1
13 Group 2 1 13 1
14 Group 2 2 14 1
15 Group 2 1 15 1
16 Group 2 2 16 2
17 Group 2 1 17 2
18 Group 2 2 18 2
19 Group 2 1 19 2
20 Group 2 2 20 2
Я надеялся на вывод примерно следующего содержания:
df %>%
group_by(group, subgroup) %>%
# INSERT MAGIC FUNCTION TO BIN DATA
@docendodiscimus, который кажется таким очевидным, когда ты это пишешь, глупый я. Если вы поставите это в качестве ответа, я отмечу его как принятый: использование cut сохраняет гибкость, если нужно назначить больше значений перерывов.





Для такого случая вам не обязательно нужен cut. С использованием:
df %>%
group_by(group, subgroup) %>%
mutate(cut_grp = (value > mean(value)) + 1)
дает:
# A tibble: 20 x 4 # Groups: group, subgroup [4] group subgroup value cut_grp <fct> <dbl> <int> <dbl> 1 Group 1 1. 1 1. 2 Group 1 2. 2 1. 3 Group 1 1. 3 1. 4 Group 1 2. 4 1. 5 Group 1 1. 5 1. 6 Group 1 2. 6 1. 7 Group 1 1. 7 2. 8 Group 1 2. 8 2. 9 Group 1 1. 9 2. 10 Group 1 2. 10 2. 11 Group 2 1. 11 1. 12 Group 2 2. 12 1. 13 Group 2 1. 13 1. 14 Group 2 2. 14 1. 15 Group 2 1. 15 1. 16 Group 2 2. 16 1. 17 Group 2 1. 17 2. 18 Group 2 2. 18 2. 19 Group 2 1. 19 2. 20 Group 2 2. 20 2.
Если вы хотите использовать cut, вы можете сделать это следующим образом:
df %>%
group_by(group, subgroup) %>%
mutate(bin = cut(value, breaks = c(-Inf, mean(value), Inf), labels = c(1,2)))
Если я сделаю это, но выберу breaks = 3, есть ли способ узнать интервалы, которые выбрала функция?
@CamilaVargasRestrepo, если вы не укажете labels = ... в вызове функции, вы получите лабораторные данные, которые сообщают вам фактические интервалы.
что-то вроде
mutate(bin = cut(value, breaks = c(-Inf, mean(value), Inf), labels = c(1,2))), если вы хотите использоватьcut