添加一个新列替换R中的NA值

时间:2019-10-02 18:17:59

标签: r

我正在分析某些特定位置的一些变量。这些变量的NA值应替换为相邻列中的值。我找到了一种方法,但是如果我有更多的列,那不是一种有效的方法。你能帮忙吗?

数据集:

location <- rep(c("A", "B", "C"), times = 2)
v1 <- c(11,92,NA,NA,NA,NA)
v2 <- c(NA,NA,NA,50,NA,NA)
v3 <- c(NA,NA,66,NA,NA,79)
v4 <- c(NA,NA,NA,74,23,88)
df <- data.frame(location,v1,v2,v3,v4)

enter image description here

我尝试了这种方法来创建一个新列,其中NA值被其他列中的值替换。

library (dplyr)
col_1 <- df %>% mutate(new_col = v1 %>% is.na %>% ifelse(v2,v1))
col_2 <- col_1 %>% mutate(new_col_1 = new_col %>% is.na %>% ifelse(v3,new_col))
col_3 <- col_2 %>% mutate(final_col = new_col_1 %>% is.na %>% ifelse(v4,new_col_1))

enter image description here

它可以解决问题,但是我有两个问题: 1.有什么有效的方法可以代替创建三列吗? 2.对于v3和v4或v2和v4中的某些情况,可以用多个值代替NA,我可以取这些值的平均值代替吗?怎么样? 预先感谢。

1 个答案:

答案 0 :(得分:1)

我们可以使用coalesce

library(dplyr)
library(purrr)
df %>% 
  mutate(new = coalesce(!!! rlang::syms(names(.)[-1])))

df %>%
    mutate(new = reduce(.[-1], coalesce))
#  location v1 v2 v3 v4 new
#1        A 11 NA NA NA  11
#2        B 92 NA NA NA  92
#3        C NA NA 66 NA  66
#4        A NA 50 NA 74  50
#5        B NA NA NA 23  23
#6        C NA NA 79 88  79