Функция mutate_at отменяет предыдущий mutate_at - PullRequest
0 голосов
/ 02 января 2019

Я создал фрейм данных S, объединив два фрейма данных innov2015 и innov2017 в один уникальный столбец идентификации.Некоторые случаи в innov2015 не включены в innov2017 и наоборот, поэтому для некоторых случаев есть записи NA для половины переменных в S.

Я хочу вычислить p = (p_2015 + p_2017) / 2однако, когда есть запись NA для p_2015, я хочу p = p_2017 и наоборот.

Я пытался сделать это с помощью:

    S <- merge(x = innov_2015_2, y = innov_2017_2, by = "cell_no", all = TRUE) %>%
  mutate(p = 0) %>%
  mutate_at(vars(p), funs(ifelse(is.na(smalln_2015), p_2017,(p_2015+p_2017)/2))) %>%
  mutate_at(vars(p), funs(ifelse(is.na(smalln_2017), p_2015,(p_2015+p_2017)/2))) %>%  

Если я запускаю

    S <- merge(x = innov_2015_2, y = innov_2017_2, by = "cell_no", all = TRUE) %>%
  mutate(p = 0) %>%
  mutate_at(vars(p), funs(ifelse(is.na(smalln_2015), p_2017,(p_2015+p_2017)/2))) %>%

p принимает желаемое значение.

, когда я запускаю оба оператора mutate_at ()

    S <- merge(x = innov_2015_2, y = innov_2017_2, by = "cell_no", all = TRUE) %>%
  mutate(p = 0) %>%
  mutate_at(vars(p), funs(ifelse(is.na(smalln_2015), p_2017,(p_2015+p_2017)/2))) %>%
  mutate_at(vars(p), funs(ifelse(is.na(smalln_2017), p_2015,(p_2015+p_2017)/2))) %>% 

, второй оператор mutate_at () создает желаемые значения, однако он отменяет первыйОператор mutate_at () и где p принял правильное значение, теперь есть NA

Что мне нужно сделать, чтобы оба оператора mutate_at () работали без отмены предыдущего?

1 Ответ

0 голосов
/ 02 января 2019

Эти два mutate конфликта. Вы полностью переопределяете «p» в каждом из них, поскольку значение «p» из первого вызова никогда не используется повторно во втором. Комментарий @ Lennyy выполнит работу, но если вы хотите оставить эту операцию в пределах tidyverse , вам, возможно, повезет больше, если использовать case_when. Ваш пример не полностью воспроизводим, поэтому ниже приведено предположение о том, как он должен работать:

S <- merge(x = innov_2015_2, y = innov_2017_2, by = "cell_no", all = TRUE) %>%
  mutate(p = case_when(
    is.na(smalln_2015) ~ smalln_2017,
    is.na(smalln_2017) ~ smalln_2015,
    TRUE ~ (smalln_2015 + smalln_2017) / 2
  ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...