如何在tidyverse中设置tibble字符列的latin1编码?
为字符列批量设置latin1编码(tidyverse实现)
问题背景
从MySQL数据库获取的数据以latin1编码返回,呈现为含十六进制转义的tibble(示例数据如下):
> data # A tibble: 52 × 4 id code swe_name eng_name <int> <chr> <chr> <chr> 1 0 "" "" "" 2 1 "M" "muskel" "muscle" 3 2 "L" "lever" "liver" 4 3 "N" "njure" "kidney" 5 4 "Fj" "fj\xe4der" "feather" 6 5 "Hj" "hj\xe4rna" "brain" 7 6 "\xd6" "\xf6vrigt" "other" 8 7 "Ind" "hela individen" "whole individual" 9 8 "F" "fett/talg" "fat" 10 9 "DF" "sp\xe4ck" "lard" # ℹ 42 more rows # ℹ Use `print(n = ...)` to see more rows
需要为所有字符列设置编码为latin1,原手动循环写法可读性差且繁琐:
for (c in colnames(data)[vapply(data, is.character, TRUE)]) { Encoding(data[, c, drop = TRUE]) <- "latin1" }
希望借助tidyverse的dplyr工具实现更简洁的批量处理。
解决方案
利用dplyr::mutate()结合across(),将编码设置逻辑包装在匿名函数中,即可批量处理所有字符列:
library(dplyr) # 批量设置字符列的编码为latin1 data <- data %>% mutate(across(where(is.character), ~ { Encoding(.) <- "latin1" . }))
说明
where(is.character)用于精准筛选所有字符类型的列,替代手动筛选列名的操作;- 由于
Encoding(x) <- "latin1"是原地修改的赋值操作,无法直接在mutate中使用,因此将其包装在匿名函数内:先修改向量的编码属性,再返回修改后的向量,确保在dplyr的管道流中生效; - 该写法完全符合tidyverse风格,代码更简洁易读,且便于后续扩展其他列处理逻辑。
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

