Измените значения, если какое-либо другое наблюдение также обновляется в R

#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)).
  

Обратите внимание, что должны произойти две вещи:

  1. Значения с помощью id1 = 1 и id2 = 2 группируются вместе. Это должно произойти из-за второй и третьей строк: |10 - 5| <= 5 . Но даже если это неверно, скажем, для строк 2 и 4 или 3 и 4, они все равно должны быть сгруппированы вместе, потому что наблюдения, которые были сгруппированы на первом шаге, не должны быть непревзойденными на втором.

  2. Группа с 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. Я знаю первый шаг, проблема на самом деле была второй. Я немного подробнее описал это