使用函数替换数据框中的许多缺失列

Replacing many missing columns in a Data Frame using a function

我有一个包含数百列且缺少值的分类数据集。我正在尝试编写一个可以快速执行此操作的函数,但 运行 遇到了问题。这是我到目前为止所做的。不胜感激:

df <- data.frame(
  id=c(10, 20, 30, 40, 50,60),
  gender=c('male', 'female', 'female', 'male', 'female', ''),
  mood=c('happy', 'sad', 'happy', 'sad','happy', ''),
  outcome=c(1, 1, 0, 0, 0,1),
  province = c('gp', 'np','ec','', 'wc', 'nw'))

我希望能够对每个变量执行此操作:

print("before")
df %>%
count(gender)

levels(df$gender) <- c(levels(df$gender), "Unknown")

df <- df %>% 
    mutate(gender = replace(gender, gender == "", "Unknown"))

print("after ")
df %>%
count(gender)

我在一个函数中实现它的尝试如下,我有一个函数一次接受一个变量:

valueFiller <- function(myVar){
    print("before")
    df %>%
    count(myVar)

    levels(df$myVar) <- c(levels(df$myVar), "Unknown")

    df <- df %>% 
        mutate(myVar = replace(myVar, myVar == "", "Unknown"))

    print("after ")
    df %>%
    count(myVar)
}

然后我打算这样应用到很多列(但这是一次1个~我需要能够一次使用一个带有变量的列表):

df$mood <-mapply(valueFiller, df$mood)
df

我的功能不起作用。请帮助执行此操作。可能有更好的方法来做到这一点,很想听听。

谢谢!

您可以使用 forcats 包中的 fct_recode,传递“命名字符向量,其中名称给出新级别,值给出旧级别”:

library(forcats)

df <- tibble::tibble(
  id=c(10, 20, 30, 40, 50,60),
  gender=c('male', 'female', 'female', 'male', 'female', ''),
  mood=c('happy', 'sad', 'happy', 'sad','happy', ''),
  outcome=c(1, 1, 0, 0, 0,1),
  province = c('gp', 'np','ec','', 'wc', 'nw'))

forcats::fct_recode(df$province, "Unknown" = "")
#> [1] gp      np      ec      Unknown wc      nw     
#> Levels: Unknown ec gp np nw wc

reprex package (v2.0.0)

于 2021-05-31 创建

将其包装在 dplyr::mutate() 调用中可以让您一次将其应用于多个变量:

library(dplyr)

df <- tibble::tibble(
  id=c(10, 20, 30, 40, 50,60),
  gender=c('male', 'female', 'female', 'male', 'female', ''),
  mood=c('happy', 'sad', 'happy', 'sad','happy', ''),
  outcome=c(1, 1, 0, 0, 0,1),
  province = c('gp', 'np','ec','', 'wc', 'nw'))


df %>% 
  mutate(across(c(gender, mood, province),
                ~ forcats::fct_recode(.x, "Unknown" = "")))

#> # A tibble: 6 x 5
#>      id gender  mood    outcome province
#>   <dbl> <fct>   <fct>     <dbl> <fct>   
#> 1    10 male    happy         1 gp      
#> 2    20 female  sad           1 np      
#> 3    30 female  happy         0 ec      
#> 4    40 male    sad           0 Unknown 
#> 5    50 female  happy         0 wc      
#> 6    60 Unknown Unknown       1 nw

reprex package (v2.0.0)

于 2021-05-31 创建

对于较旧的 dplyr 版本(v1.0.0 之前),您还可以使用 mutate_at(注意:您仍然可以在较新的版本中使用它,但已被 across 在 v1.0.0 中):

library(dplyr)

df %>% 
  mutate_at(c("gender", "mood", "province"),
            ~ forcats::fct_recode(.x, "Unknown" = ""))

#> # A tibble: 6 x 5
#>      id gender  mood    outcome province
#>   <dbl> <fct>   <fct>     <dbl> <fct>   
#> 1    10 male    happy         1 gp      
#> 2    20 female  sad           1 np      
#> 3    30 female  happy         0 ec      
#> 4    40 male    sad           0 Unknown 
#> 5    50 female  happy         0 wc      
#> 6    60 Unknown Unknown       1 nw

reprex package (v2.0.0)

于 2021-05-31 创建