R условно перенесено последним по группе и по условию - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь вменять LOCF числовой c переменной «x.val» по двум группам (ID и циклическая категория c переменная «current.group»), но я хочу сделать группы разными, где они разделены строками из разных групп)

data.frame(ID = c("1001", "1001", "1001", "1001", "1001", "1001", "1001", "1002", "1002", "1002", "1002", "1002", "1002", "1002"), 
current.group = c("a", "a", "b", "a", "b", "b", "c", "a", "a", "a", "a", "a", "a", "c"), 
x.val = c(433, NA, NA, 362, NA, NA, 125, 158, NA, NA, NA, 111, NA, 101))

Я бы хотел добиться вменения только в текущей группе для интанса, 4-я позиция для субъекта 1001 - это та же группа «a», что и строки 1 и 2, но новый цикл, поэтому я хочу, чтобы он был отделен от строк 1 и 2 как отдельная группа. Результат должен быть:

1001, 1001, 1001, 1001, 1001, 1001, 1001, 1002, 1002, 1002, 1002, 1002, 1002, 1002
a, a, b, a, b, b, c, a, a, a, a, a, a, c
433, 433, NA, 362, NA, NA, 125, 158, 158, 158, 158, 111, 111, 101

Однако, если я использую функцию group_by, она просто возьмет все экземпляры «current.group» во всем фрейме данных (сгруппированные по идентификатору). Я склонен думать, что есть способ создания производной переменной, которая указывает на эти отдельные группы и group_by для этой новой переменной. Тем не менее, мне интересно, есть ли другой подход в dplyr или с использованием каких-либо других средств

Это трудно объяснить, что я имею в виду, поэтому я надеюсь, что дело доходит до того, что я хочу group_by, но различать экземпляры, разделенные строками другая группа

1 Ответ

0 голосов
/ 13 июля 2020

Вы можете создавать нециклические c группы из вашей циклической c группировки. После просто group_by вместо этой новой группировки.

df$non.cyclic.groups <- cumsum(c(0,diff(as.numeric(factor(df$current.group))))!=0)

     ID current.group x.val non.cyclic.groups
1  1001             a   433                 0
2  1001             a    NA                 0
3  1001             b    NA                 1
4  1001             a   362                 2
5  1001             b    NA                 3
6  1001             b    NA                 3
7  1001             c   125                 4
8  1002             a   158                 5
9  1002             a    NA                 5
10 1002             a    NA                 5
11 1002             a    NA                 5
12 1002             a   111                 5
13 1002             a    NA                 5
14 1002             c   101                 6
...