aae
aae

Reputation: 440

How to declare encoding for all character columns in a data frame?

Loading data from a package on a windows machine, encoding is botched.

require(vegdata)
tax_dbf <- load.taxlist("GermanSL 1.3", detailed=TRUE)
tax_dbf[33,"BEGRUEND"]

[1] " "Einfügen einer Zwischenebene""

I can fix that:

Encoding(tax_dbf$BEGRUEND) <- "UTF-8"
tax_dbf[33,"BEGRUEND"]

[1] "Einfügen einer Zwischenebene"

However, I didn't manage to find an easy way to declare encoding for all character columns in the df, and my SO search foo is weak today as well. This is confuddling.

Anyone from the tidyverse having a oneliner for my prose?

Upvotes: 2

Views: 3109

Answers (1)

JdeMello
JdeMello

Reputation: 1718

No need to use tidyverse. Just loop over columns that satisfy the condition:

set.seed(1)

df <- data.frame(a = rep("Einfügen einer Zwischenebene", 5), b = runif(5), c = rep("Einfügen einer Zwischenebene", 5), stringsAsFactors = F)

cols <- names(df)

for(i in seq_along(cols)){

  if(!is.character(df[, cols[[i]]])) next

  Encoding(df[, cols[[i]]]) <- "UTF-8"

}

Resulting in:

> df
                             a         b                            c
1 Einfügen einer Zwischenebene 0.2655087 Einfügen einer Zwischenebene
2 Einfügen einer Zwischenebene 0.3721239 Einfügen einer Zwischenebene
3 Einfügen einer Zwischenebene 0.5728534 Einfügen einer Zwischenebene
4 Einfügen einer Zwischenebene 0.9082078 Einfügen einer Zwischenebene
5 Einfügen einer Zwischenebene 0.2016819 Einfügen einer Zwischenebene

dplyr solution

dplyr::mutate_if(df, is.character, .funs = function(x){return(`Encoding<-`(x, "UTF-8"))})

Upvotes: 5

Related Questions