如何制作一个函数,用另一列中的值填充一列中的空行?

How to make a function that fills empty rows in one column with the values of those in another column?

我想制作获取这些数据的函数

now      changed   before
"12ab"   "yes"     "21ba"
"34de"   "no"      
"56fg"   "yes"     "gf65"
"78hi"   "no"      NA

并把它变成

now      changed   before
"12ab"   "yes"     "21ba"
"34de"   "no"      "34de"
"56fg"   "yes"     "gf65"
"78hi"   "no"      "78hi"

所以如果 before 是空的,我想 before 取 now 的值(假设如果它没有改变,它一定是一样的。

我想使用一个函数,因为我想将它应用到更多的列对。

我试过这个:

library(purrr)
library(dplyr)
fun <- function(data, x, y) {
     coalesce(case_when(data[[y]] == NA | data[[y]] == '' ~ data[[x]], data[[y]])
}
df[c("before", "before1")] <- map2(c("now", "now1"),c("before", "before1") ~  fun(df, .x, .y))

但它什么也没做。

您可以使用 dplyr::na_if 将空字符串转换为 NA 并使用 dplyr::coalesce:

合并
library(dplyr)
df %>% 
  na_if("") %>% 
  mutate(before = coalesce(before, now))

#    now changed before
# 1 12ab     yes   21ba
# 2 34de      no   34de
# 3 56fg     yes   gf65
# 4 78hi      no   78hi

作为函数,您可以:

f <- function(data, x, y){
  data %>% 
    na_if("") %>% 
    mutate(before = coalesce({{x}}, {{y}}))
}

f(df, before, now)

请参阅我上面关于在读取数据时定义 na.strings 的评论。然后就可以用base R补缺数据了:

df$before[is.na(df$before)] <- df$now[is.na(df$before)]