You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 12:20:07