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

R语言向量调用unique()函数重复返回相同值的问题

问题:使用unique()获取存储类型向量唯一值时,出现重复的"HDD"/"SSD"条目?

我有一个包含存储类型的R向量(内容见下方),调用unique(data0$Storage Type)时,返回结果里出现了看似重复的值,比如"HDD"和"‎HDD"、"SSD"和"‎SSD",请问为什么无法得到唯一的"HDD"/"SSD"值?

向量内容:

c("SSD", "PCIe SSD", "PCIe SSD", "PCIe SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "TB SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "PCIe SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "PCle SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "HDD", "HDD", "HDD", "N/A", "HDD", "‎HDD", 
"N/A", "N/A", "N/A", "Hybrid Drive", "HDD", "‎SSD", "‎HDD", 
"SSD", "N/A", "SSD", "N/A", "SSD", "SSD", "‎SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "‎SSD", "‎SSD", "‎SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "PCIe SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", 
"SSD", "eMMC", "SSD", "Flash Memory", "SSD", "SSD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "SSD", "SSD", "eMMC", "SSD", "SSD", "SSD", 
"SSD", "Flash Memory", "SSD", "SSD", NA, "SSD", "SSD", "M.2 PCI", 
"M.2 PCI", "SSD", "M.2 PCI", "M.2 PCI", "N/A", "SSD", "HDD", 
"M.2 PCI", "HDD", "M.2 PCI", "Flash/SSD", "M.2 PCI", "NVMe M.2", 
"N/A", "M.2 PCI", "HDD", "SSD", "M.2 PCI", "NVMe M.2", "M.2 PCI", 
"M.2 PCI", "M.2 PCI", "M.2 PCI", "M.2 PCI", "SSD", "SSD", "SSD", 
"M.2 PCI", "SSD", "M.2 PCI", "SSD", "SSD", "SSD", "SSD", "SSD", 
"M.2 PCI", "SSD", "M.2 PCI", "HDD", "SSD", "M.2 PCI", "SSD", 
"HDD", "NVMe M.2", "Hybrid Drive", "N/A", "N/A", "HDD", "N/A", 
"SSD", "SSD", "M.2 PCI", "SSD", "SSD", "SSD", "SSD", "HDD", "SSD", 
"SSD", "SSD", "NVMe M.2 PCI", "SSD", "SSD", "SSD", "Flash", "SSD", 
"SSD", "NVMe M.2 PCI", "SSD", "SSD", "‎HDD", "SSD", "SSD", 
"SSD", "SSD", "SSD", "HDD", "‎SSD", "HDD", "‎SSD", "‎SSD", 
"DVDRW", "N/A", "HDD", "HDD", "‎SSD", "HDD", "HDD", "‎SSD", 
"N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", 
NA, NA, NA, NA, NA, NA, NA, "SSD", NA, NA)

sessionInfo:

sessionInfo()

R version 4.3.1 (2023-06-16 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19045)

Matrix products: default


locale:
[1] LC_COLLATE=English_United States.utf8  LC_CTYPE=English_United States.utf8   
[3] LC_MONETARY=English_United States.utf8 LC_NUMERIC=C                           
[5] LC_TIME=English_United States.utf8    

time zone: Europe/Bucharest
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base      

loaded via a namespace (and not attached):
[1] zoo_1.8-12        compiler_4.3.1    tools_4.3.1       rstudioapi_0.15.0 grid_4.3.1        lattice_0.21-8 

原因分析

那些看似相同的字符串(如"HDD"和"‎HDD")实际上包含不可见的Unicode控制字符,比如"‎HDD"开头的左到右标记(U+200E)。R会严格按照字符串的字节内容判断唯一性,带控制字符的字符串和普通字符串会被视为不同值,因此unique()会将它们分开返回。

另外还存在可见的拼写错误,比如"PCIe SSD"和"PCle SSD"(字母l和i混淆),这也会被unique()识别为不同值。


验证方法

可以用charToRaw()查看字符串的原始字节,对比两者差异:

# 普通HDD的字节
charToRaw("HDD")
# 输出: 0x48 0x44 0x44

# 带不可见字符的HDD的字节
charToRaw("‎HDD")
# 输出: 0xe2 0x80 0x8e 0x48 0x44 0x44

可以看到后者多了三个字节(对应U+200E字符)。


解决方法

1. 移除不可见控制字符

用正则表达式过滤掉所有不可见的控制字符,有两种方式:

方式一:base R实现

# 清理存储类型列中的不可见字符
data0$`Storage Type` <- gsub("\\p{C}", "", data0$`Storage Type`, perl = TRUE)

# 或者用[:print:]匹配所有可见字符
data0$`Storage Type` <- gsub("[^[:print:]]", "", data0$`Storage Type`)

方式二:stringr包实现

如果安装了stringr包,代码更简洁:

library(stringr)
data0$`Storage Type` <- str_remove_all(data0$`Storage Type`, "\\p{C}")

2. 修正可见拼写错误

手动统一拼写不一致的条目:

# 把"PCle SSD"替换为"PCIe SSD"
data0$`Storage Type` <- gsub("PCle SSD", "PCIe SSD", data0$`Storage Type`)

3. 重新获取唯一值

清理完成后,再调用unique()就能得到正确的唯一值:

unique(data0$`Storage Type`)

内容的提问来源于stack exchange,提问作者firmo23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:27:01