使用地图函数更改数据帧的编码
Change Encoding of a dataframe using map functions
我能够使用 中提供的代码更改数据帧的编码,但我想使用 map 而不是 for 循环,但我无法这样做并且可以弄清楚为什么。我打算将它用作管道工作流,使用 for 循环会非常麻烦。
# Example of the data:
dat <- structure(list(CNES = c("0137162", "0137170", "0137189", "0137197",
"0137200", "0137219"), CPF_CNPJ = c("87768735000148", "03005201000170",
"00000000000000", "00000000000000", "00000000000000", "87775334000115"
), FANTASIA = c("HOSPITAL DE CARIDADE E BENEFIC\xcaNCIA", "COELHO & JUNG INSTITUTO DE OFTALMOLOGIA LTDA",
"UNIDADE SANIT\xc1RIA 03 - PR\xc9DIO HOSPITAL DA LIGA", "UNIDADE SANIT\xc1RIA 11 - BOSQUE",
"PROGRAMA DE SA\xdaDE DA FAM\xcdLIA 01 - BAIRRO PROMORAR", "SIND TRAB IND ALIMENTA\xc7\xc3O"
), RAZ_SOCI = c("CNPJ 87.768.735/0001-48-HOSPITAL DE CARIDADE E BENEFIC\xcaNCIA",
"CNPJ 03.005.201/0001-70-COELHO & JUNG INSTITUTO DE OFTALMOLOGIA LTDA",
"CNPJ 00.000.000/0000-00-PREFEITURA MUNICIPAL DE CACHOEIRA DO SUL",
"CNPJ 00.000.000/0000-00-PREFEITURA MUNICIPAL DE CACHOEIRA DO SUL",
"CNPJ 00.000.000/0000-00-PREFEITURA MUNICIPAL DE CACHOEIRA DO SUL",
"CNPJ 87.775.334/0001-15-SINDICATO DOS TRABALHADORES NA INDUSTRIA DA ALIMENTA\xc7\xc3O"
)), row.names = c("1", "2", "3", "4", "5", "6"), class = "data.frame")
# Using map
dat %>%
map(~ Encoding(.x) <- "latin1")
我们还需要return数据
library(dplyr)
library(purrr)
dat1 <- dat %>%
map_dfc(~ {
Encoding(.x) <- "latin1"
.x})
这也可以通过使用赋值函数在一行中完成 Encoding<-
dat1 <- dat %>%
map_dfc(~ `Encoding<-`(.x, "latin1"))
或者没有 lambda 调用
dat %>%
map_dfc(`Encoding<-`, "latin1")
-检查原始数据和更新后的结构
str(dat)
#'data.frame': 6 obs. of 4 variables:
# $ CNES : chr "0137162" "0137170" "0137189" "0137197" ...
# $ CPF_CNPJ: chr "87768735000148" "03005201000170" "00000000000000" "00000000000000" ...
# $ FANTASIA: chr "HOSPITAL DE CARIDADE E BENEFIC\xcaNCIA" "COELHO & JUNG INSTITUTO DE OFTALMOLOGIA LTDA" "UNIDADE SANIT\xc1RIA 03 - PR\xc9DIO HOSPITAL DA LIGA" "UNIDADE SANIT\xc1RIA 11 - BOSQUE" ...
# $ RAZ_SOCI: chr "CNPJ 87.768.735/0001-48-HOSPITAL DE CARIDADE E BENEFIC\xcaNCIA" "CNPJ 03.005.201/0001-70-COELHO & JUNG INSTITUTO DE OFTALMOLOGIA LTDA" "CNPJ 00.000.000/0000-00-PREFEITURA MUNICIPAL DE CACHOEIRA DO SUL" "CNPJ 00.000.000/0000-00-PREFEITURA MUNICIPAL DE CACHOEIRA DO SUL" ...
str(dat1)
#tibble [6 × 4] (S3: tbl_df/tbl/data.frame)
# $ CNES : chr [1:6] "0137162" "0137170" "0137189" "0137197" ...
# $ CPF_CNPJ: chr [1:6] "87768735000148" "03005201000170" "00000000000000" "00000000000000" ...
# $ FANTASIA: chr [1:6] "HOSPITAL DE CARIDADE E BENEFICÊNCIA" "COELHO & JUNG INSTITUTO DE OFTALMOLOGIA LTDA" "UNIDADE SANITÁRIA 03 - PRÉDIO HOSPITAL DA LIGA" "UNIDADE SANITÁRIA 11 - BOSQUE" ...
# $ RAZ_SOCI: chr [1:6] "CNPJ 87.768.735/0001-48-HOSPITAL DE CARIDADE E BENEFICÊNCIA" "CNPJ 03.005.201/0001-70-COELHO & JUNG INSTITUTO DE OFTALMOLOGIA LTDA" "CNPJ 00.000.000/0000-00-PREFEITURA MUNICIPAL DE CACHOEIRA DO SUL" "CNPJ 00.000.000/0000-00-PREFEITURA MUNICIPAL DE CACHOEIRA DO SUL" ...
或按列检查
sapply(dat, Encoding)
# CNES CPF_CNPJ FANTASIA RAZ_SOCI
#[1,] "unknown" "unknown" "unknown" "unknown"
#[2,] "unknown" "unknown" "unknown" "unknown"
#[3,] "unknown" "unknown" "unknown" "unknown"
#[4,] "unknown" "unknown" "unknown" "unknown"
#[5,] "unknown" "unknown" "unknown" "unknown"
#[6,] "unknown" "unknown" "unknown" "unknown"
sapply(dat1, Encoding)
# CNES CPF_CNPJ FANTASIA RAZ_SOCI
#[1,] "unknown" "unknown" "latin1" "latin1"
#[2,] "unknown" "unknown" "unknown" "unknown"
#[3,] "unknown" "unknown" "latin1" "unknown"
#[4,] "unknown" "unknown" "latin1" "unknown"
#[5,] "unknown" "unknown" "latin1" "unknown"
#[6,] "unknown" "unknown" "latin1" "latin1"
或者我们也可以使用across
dat1 <- dat %>%
mutate(across(everything(), ~ `Encoding<-`(.x, "latin1")))
这里有一个 data.table
选项,它可能会起作用并有所帮助
setDT(dat)[, lapply(.SD, `Encoding<-`, "latin1")]
我能够使用
# Example of the data:
dat <- structure(list(CNES = c("0137162", "0137170", "0137189", "0137197",
"0137200", "0137219"), CPF_CNPJ = c("87768735000148", "03005201000170",
"00000000000000", "00000000000000", "00000000000000", "87775334000115"
), FANTASIA = c("HOSPITAL DE CARIDADE E BENEFIC\xcaNCIA", "COELHO & JUNG INSTITUTO DE OFTALMOLOGIA LTDA",
"UNIDADE SANIT\xc1RIA 03 - PR\xc9DIO HOSPITAL DA LIGA", "UNIDADE SANIT\xc1RIA 11 - BOSQUE",
"PROGRAMA DE SA\xdaDE DA FAM\xcdLIA 01 - BAIRRO PROMORAR", "SIND TRAB IND ALIMENTA\xc7\xc3O"
), RAZ_SOCI = c("CNPJ 87.768.735/0001-48-HOSPITAL DE CARIDADE E BENEFIC\xcaNCIA",
"CNPJ 03.005.201/0001-70-COELHO & JUNG INSTITUTO DE OFTALMOLOGIA LTDA",
"CNPJ 00.000.000/0000-00-PREFEITURA MUNICIPAL DE CACHOEIRA DO SUL",
"CNPJ 00.000.000/0000-00-PREFEITURA MUNICIPAL DE CACHOEIRA DO SUL",
"CNPJ 00.000.000/0000-00-PREFEITURA MUNICIPAL DE CACHOEIRA DO SUL",
"CNPJ 87.775.334/0001-15-SINDICATO DOS TRABALHADORES NA INDUSTRIA DA ALIMENTA\xc7\xc3O"
)), row.names = c("1", "2", "3", "4", "5", "6"), class = "data.frame")
# Using map
dat %>%
map(~ Encoding(.x) <- "latin1")
我们还需要return数据
library(dplyr)
library(purrr)
dat1 <- dat %>%
map_dfc(~ {
Encoding(.x) <- "latin1"
.x})
这也可以通过使用赋值函数在一行中完成 Encoding<-
dat1 <- dat %>%
map_dfc(~ `Encoding<-`(.x, "latin1"))
或者没有 lambda 调用
dat %>%
map_dfc(`Encoding<-`, "latin1")
-检查原始数据和更新后的结构
str(dat)
#'data.frame': 6 obs. of 4 variables:
# $ CNES : chr "0137162" "0137170" "0137189" "0137197" ...
# $ CPF_CNPJ: chr "87768735000148" "03005201000170" "00000000000000" "00000000000000" ...
# $ FANTASIA: chr "HOSPITAL DE CARIDADE E BENEFIC\xcaNCIA" "COELHO & JUNG INSTITUTO DE OFTALMOLOGIA LTDA" "UNIDADE SANIT\xc1RIA 03 - PR\xc9DIO HOSPITAL DA LIGA" "UNIDADE SANIT\xc1RIA 11 - BOSQUE" ...
# $ RAZ_SOCI: chr "CNPJ 87.768.735/0001-48-HOSPITAL DE CARIDADE E BENEFIC\xcaNCIA" "CNPJ 03.005.201/0001-70-COELHO & JUNG INSTITUTO DE OFTALMOLOGIA LTDA" "CNPJ 00.000.000/0000-00-PREFEITURA MUNICIPAL DE CACHOEIRA DO SUL" "CNPJ 00.000.000/0000-00-PREFEITURA MUNICIPAL DE CACHOEIRA DO SUL" ...
str(dat1)
#tibble [6 × 4] (S3: tbl_df/tbl/data.frame)
# $ CNES : chr [1:6] "0137162" "0137170" "0137189" "0137197" ...
# $ CPF_CNPJ: chr [1:6] "87768735000148" "03005201000170" "00000000000000" "00000000000000" ...
# $ FANTASIA: chr [1:6] "HOSPITAL DE CARIDADE E BENEFICÊNCIA" "COELHO & JUNG INSTITUTO DE OFTALMOLOGIA LTDA" "UNIDADE SANITÁRIA 03 - PRÉDIO HOSPITAL DA LIGA" "UNIDADE SANITÁRIA 11 - BOSQUE" ...
# $ RAZ_SOCI: chr [1:6] "CNPJ 87.768.735/0001-48-HOSPITAL DE CARIDADE E BENEFICÊNCIA" "CNPJ 03.005.201/0001-70-COELHO & JUNG INSTITUTO DE OFTALMOLOGIA LTDA" "CNPJ 00.000.000/0000-00-PREFEITURA MUNICIPAL DE CACHOEIRA DO SUL" "CNPJ 00.000.000/0000-00-PREFEITURA MUNICIPAL DE CACHOEIRA DO SUL" ...
或按列检查
sapply(dat, Encoding)
# CNES CPF_CNPJ FANTASIA RAZ_SOCI
#[1,] "unknown" "unknown" "unknown" "unknown"
#[2,] "unknown" "unknown" "unknown" "unknown"
#[3,] "unknown" "unknown" "unknown" "unknown"
#[4,] "unknown" "unknown" "unknown" "unknown"
#[5,] "unknown" "unknown" "unknown" "unknown"
#[6,] "unknown" "unknown" "unknown" "unknown"
sapply(dat1, Encoding)
# CNES CPF_CNPJ FANTASIA RAZ_SOCI
#[1,] "unknown" "unknown" "latin1" "latin1"
#[2,] "unknown" "unknown" "unknown" "unknown"
#[3,] "unknown" "unknown" "latin1" "unknown"
#[4,] "unknown" "unknown" "latin1" "unknown"
#[5,] "unknown" "unknown" "latin1" "unknown"
#[6,] "unknown" "unknown" "latin1" "latin1"
或者我们也可以使用across
dat1 <- dat %>%
mutate(across(everything(), ~ `Encoding<-`(.x, "latin1")))
这里有一个 data.table
选项,它可能会起作用并有所帮助
setDT(dat)[, lapply(.SD, `Encoding<-`, "latin1")]