mutate_at函数取消上一个mutate_at

时间:2019-01-02 12:06:48

标签: r conditional-statements mutate

我通过将两个数据框innov2015和innov2017通过唯一的标识列合并来创建数据框S。 innov2015中的某些情况未包含在innov2017中,反之亦然,因此在某些情况下,S中有一半变量存在NA条目。

我想计算p =(p_2015 + p_2017)/ 2,但是,当有p_2015的NA条目时,我希望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 :(得分:1)

这两个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
  ))