l oop через итерации внутри mutate - PullRequest
1 голос
/ 06 мая 2020

Я ищу какое-нибудь решение, связанное с tidyverse, для следующей проблемы:

df <- tribble(
  ~group, ~cond1, ~cond2, ~y,
        1, 1, 1, 1,
        1, 1, 99, NA,
        1, 1, 1, NA,
        2, 1, 1, 1,
        2, 1, 1, NA,
        2, 1, 1, NA,
) %>%
  group_by(group) %>%
  mutate(y = ifelse(cond1 != 99 &
                      cond2 != 99,
                      nth(y, 1),
                    y)
  )

Как видите, я хочу обновить свою переменную y в соответствии с предыдущими значениями cond1 и cond2 в данной группе. В приведенном выше фрагменте новое значение y задается nth(y,1), как я могу адаптировать этот код, чтобы сделать его более общим, предпочтительно с помощью инструментов tidyverse?

Я хотел бы добавить итерации, в которых после работает

mutate(y = ifelse(cond1 != 99 &
                  cond2 != 99,
                  nth(y, 1),
                y))

Я бы повторил процесс, используя nth(y,2), nth(y,3) и так далее ... до некоторого числа, скажем, 5 (при условии, что мой реальный набор данных, конечно, намного больше).

1 Ответ

0 голосов
/ 06 мая 2020

Если под nth(y, i) вы имеете в виду row_number элементов с не-99 значениями cond1 и cond2 для каждой группы, вы можете просто попробовать:

df <- tribble(
    ~group, ~cond1, ~cond2, ~y,
    1, 1, 1, 1,
    1, 1, 99, NA,
    1, 1, 1, NA,
    2, 1, 1, 1,
    2, 1, 1, NA,
    2, 1, 1, NA,
) %>%
    group_by(group) %>%
    mutate(
        new_y = if_else(
            cond1 != 99 & cond2 != 99, (row_number(cond1)), as.integer(y)
            )
        )

Результат будет быть:

> df
# A tibble: 6 x 5
# Groups:   group [2]
  group cond1 cond2     y new_y
  <dbl> <dbl> <dbl> <dbl> <int>
1     1     1     1     1     1
2     1     1    99    NA    NA
3     1     1     1    NA     3
4     2     1     1     1     1
5     2     1     1    NA     2
6     2     1     1    NA     3
...