使用地图函数更改数据帧的编码

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")]