我有来自 MySQL 数据库的数据,它返回用十六进制编码的 latin1,格式如下:
> 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"
}
然而,这很难阅读并且感觉很笨拙。我想到使用 dplyr,可以使用
很好地选择列data |> select_if(is.character)
或
data |> mutate(across(where(is.character), ...))
并且我认为可能可以使用
mutate
和 across
,但是 Encoding(x) <- "latin1"
并不是真正可以应用到位的函数,并且 function(x) { Encoding(x) <- "latin1" }
不起作用。
如果可能(或更好),如何使用 dplyr 和 tidyverse 来完成此操作? 因为列选择是如此方便。