我通过唯一标识列合并 innov2015 和 innov2017 的两个数据帧来创建数据帧 S。innov2015 中的某些事例不包括在 innov2017 中,反之亦然,因此对于某些事例,S 中一半的变量都有 NA 条目。
我想计算 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() 语句都正常工作而不取消前一个语句?
这两者mutate
冲突。您正在完全重新定义每个调用中的"p",因为第一次调用中的"p"值永远不会在第二次调用中重复使用。@Lennyy的评论将完成工作,但如果您想将此操作保持在整洁的宇宙中,使用 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
))