我通过将两个数据框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()语句都起作用而又不取消前一个?
答案 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
))