#r #function #dplyr #tidyr
#r #функция #dplyr #tidyr
Вопрос:
Я был бы признателен за некоторую помощь в следующем. Вот некоторые игрушечные данные:
df <- data.frame(id1 = c(1, 1, 2, 2, 2, 3, 3, 3, 3, 3),
V1 = c(5, 10, 5, 15, 30, 1, 1, 1, 1, 1),
V2 = c(1, 2, 3, 2, 7, 4, 0, 8, 1, 3))
Идея состоит в том, чтобы постепенно разбивать данные на группы g
, присваивая новому столбцу y
максимальное значение в пределах группы в столбце V2
, на каждом этапе выполнения используя
менее строгие критерии. В этом случае есть 2 шага.
Сопоставление должно продолжаться до тех пор, пока в каждой группе не будет 5 элементов или пока не будут выполнены все шаги. Первый шаг прост — строки с одинаковыми id1
должны принадлежать к одной группе:
df1 <- data.frame(id1 = c(1, 1, 2, 2, 2, 3, 3, 3, 3, 3),
V1 = c(5, 10, 5, 15, 30, 1, 1, 1, 1, 1),
V2 = c(1, 2, 3, 2, 7, 4, 0, 8, 1, 3),
g = c(1, 1, 2, 2, 2, 3, 3, 3, 3, 3),
y = c(2, 2, 7, 7, 7, 8, 8, 8, 8, 8))
Для второго шага я хочу объединить значения, которые находятся V1
в пределах 5 единиц друг от друга ИЛИ были объединены в пару на шаге 1.
df2 <- data.frame(id1 = c(1, 1, 2, 2, 2, 3, 3, 3, 3, 3),
V1 = c(5, 10, 5, 15, 30, 1, 1, 1, 1, 1),
V2 = c(1, 2, 3, 2, 7, 4, 0, 8, 1, 3),
g = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2),
y = c(7, 7, 7, 7, 7, 8, 8, 8, 8, 8)).
Обратите внимание, что должны произойти две вещи:
-
Значения с помощью
id1 = 1
иid2 = 2
группируются вместе. Это должно произойти из-за второй и третьей строк:|10 - 5| <= 5
. Но даже если это неверно, скажем, для строк 2 и 4 или 3 и 4, они все равно должны быть сгруппированы вместе, потому что наблюдения, которые были сгруппированы на первом шаге, не должны быть непревзойденными на втором. -
Группа с
id1 = 3
не изменяется, поскольку в ней уже было 5 компонентов.
OBS: Меня не очень волнует имя g
в каждой группе, только y
.
Как я мог бы запустить код, который делает это возможным для большего набора данных с большим количеством шагов и более сложными условиями на каждом шаге?
Я знаю, как выполнять каждую классификацию независимо, но не знаю, как заставить процесс обновления работать. Я бы отдал предпочтение ответам, использующим tidyverse
Ответ №1:
Ответом на вашу первую часть может быть использование dplyr
или tidyverse
df <- data.frame(id1 = c(1, 1, 2, 2, 2, 3, 3, 3, 3, 3),
V1 = c(5, 10, 5, 15, 30, 1, 1, 1, 1, 1),
V2 = c(1, 2, 3, 2, 7, 4, 0, 8, 1, 3))
df1 <- df1 %>% group_by(id1) %>% mutate(g= id1, y= max(V2))
Я не смог толком понять вторую часть.
Комментарии:
1. Я знаю первый шаг, проблема на самом деле была второй. Я немного подробнее описал это