如何制作一个函数,用另一列中的值填充一列中的空行?
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)]
我想制作获取这些数据的函数
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)]