使用函数替换数据框中的许多缺失列
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 创建
我有一个包含数百列且缺少值的分类数据集。我正在尝试编写一个可以快速执行此操作的函数,但 运行 遇到了问题。这是我到目前为止所做的。不胜感激:
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 创建