我有下面的向量
\nc("SSD", "PCIe SSD", "PCIe SSD", "PCIe SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "TB SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "PCIe SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "PCle SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "HDD", "HDD", "HDD", "N/A", "HDD", "\xe2\x80\x8eHDD", \n"N/A", "N/A", "N/A", "Hybrid Drive", "HDD", "\xe2\x80\x8eSSD", "\xe2\x80\x8eHDD", \n"SSD", "N/A", "SSD", "N/A", "SSD", "SSD", "\xe2\x80\x8eSSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "\xe2\x80\x8eSSD", "\xe2\x80\x8eSSD", "\xe2\x80\x8eSSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "PCIe SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", "SSD", \n"SSD", "eMMC", "SSD", "Flash Memory", "SSD", "SSD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "SSD", "SSD", "eMMC", "SSD", "SSD", "SSD", \n"SSD", "Flash Memory", "SSD", "SSD", NA, "SSD", "SSD", "M.2 PCI", \n"M.2 PCI", "SSD", "M.2 PCI", "M.2 PCI", "N/A", "SSD", "HDD", \n"M.2 PCI", "HDD", "M.2 PCI", "Flash/SSD", "M.2 PCI", "NVMe M.2", \n"N/A", "M.2 PCI", "HDD", "SSD", "M.2 PCI", "NVMe M.2", "M.2 PCI", \n"M.2 PCI", "M.2 PCI", "M.2 PCI", "M.2 PCI", "SSD", "SSD", "SSD", \n"M.2 PCI", "SSD", "M.2 PCI", "SSD", "SSD", "SSD", "SSD", "SSD", \n"M.2 PCI", "SSD", "M.2 PCI", "HDD", "SSD", "M.2 PCI", "SSD", \n"HDD", "NVMe M.2", "Hybrid Drive", "N/A", "N/A", "HDD", "N/A", \n"SSD", "SSD", "M.2 PCI", "SSD", "SSD", "SSD", "SSD", "HDD", "SSD", \n"SSD", "SSD", "NVMe M.2 PCI", "SSD", "SSD", "SSD", "Flash", "SSD", \n"SSD", "NVMe M.2 PCI", "SSD", "SSD", "\xe2\x80\x8eHDD", "SSD", "SSD", \n"SSD", "SSD", "SSD", "HDD", "\xe2\x80\x8eSSD", "HDD", "\xe2\x80\x8eSSD", "\xe2\x80\x8eSSD", \n"DVDRW", "N/A", "HDD", "HDD", "\xe2\x80\x8eSSD", "HDD", "HDD", "\xe2\x80\x8eSSD", \n"N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", \nNA, NA, NA, NA, NA, NA, NA, "SSD", NA, NA)\nRun Code Online (Sandbox Code Playgroud)\n当我试图找到它的独特值时,我得到了一些像“HDD”这样的值两次。为什么我只得到一次?
\nunique(data0$`Storage Type`)\n [1] "SSD" "PCIe SSD" "TB SSD" "PCle SSD" "HDD" "N/A" "\xe2\x80\x8eHDD" \n [8] "Hybrid Drive" "\xe2\x80\x8eSSD" "eMMC" "Flash Memory" NA "M.2 PCI" "Flash/SSD" \n[15] "NVMe M.2" "NVMe M.2 PCI" "Flash" "DVDRW" \n\n\n\nsessionInfo()\n\nR version 4.3.1 (2023-06-16 ucrt)\nPlatform: x86_64-w64-mingw32/x64 (64-bit)\nRunning under: Windows 10 x64 (build 19045)\n\nMatrix products: default\n\n\nlocale:\n[1] LC_COLLATE=English_United States.utf8 LC_CTYPE=English_United States.utf8 \n[3] LC_MONETARY=English_United States.utf8 LC_NUMERIC=C \n[5] LC_TIME=English_United States.utf8 \n\ntime zone: Europe/Bucharest\ntzcode source: internal\n\nattached base packages:\n[1] stats graphics grDevices utils datasets methods base \n\nloaded via a namespace (and not attached):\n[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 \nRun Code Online (Sandbox Code Playgroud)\n
一些HDD字符串具有隐藏字符:
> cat(rawToChar(charToRaw(unique(dat)[7])), "\\n")\n\xe2\x80\x8e HDD \n> cat(rawToChar(charToRaw(unique(dat)[5])), "\\n")\nHDD \nRun Code Online (Sandbox Code Playgroud)\n如果将其粘贴到终端中,您实际上可以看到这一点
\n"<200e>\xe2\x80\x8eHDD"
因此,您的数据包含<200e>\xe2\x80\x8e从左到右的标记,这是不可打印的 unicode 表示形式。
删除所有非 ASCII 字符,如下所示:
\ndat = iconv(dat, to = "ASCII//TRANSLIT")\nRun Code Online (Sandbox Code Playgroud)\n或(感谢jpsmith)
\ndat = iconv(dat, from = "ASCII", to = "latin1")\nRun Code Online (Sandbox Code Playgroud)\n> unique(dat)\n [1] "SSD" "PCIe SSD" "TB SSD" "PCle SSD" "HDD" \n [6] "N/A" NA "Hybrid Drive" "eMMC" "Flash Memory"\n[11] "M.2 PCI" "Flash/SSD" "NVMe M.2" "NVMe M.2 PCI" "Flash" \n[16] "DVDRW" \nRun Code Online (Sandbox Code Playgroud)\n如果没有,那么我们可以使用旧的正则表达式来匹配任何不属于常规 ASCII 字符的内容:
\nlibrary(stringr)\n\ndat[str_detect(dat, "[^\\x01-\\x7F]")]\n\n [1] "\xe2\x80\x8eHDD" "\xe2\x80\x8eSSD" "\xe2\x80\x8eHDD" "\xe2\x80\x8eSSD" "\xe2\x80\x8eSSD" "\xe2\x80\x8eSSD" "\xe2\x80\x8eSSD" NA "\xe2\x80\x8eHDD" "\xe2\x80\x8eSSD" "\xe2\x80\x8eSSD" "\xe2\x80\x8eSSD"\n[13] "\xe2\x80\x8eSSD" "\xe2\x80\x8eSSD" NA NA NA NA NA NA NA NA NA \nRun Code Online (Sandbox Code Playgroud)\n然后
\ndata = ifelse(data %in% NA, NA, str_remove_all(data, "[^\\x01-\\x7F]"))\nunique(data)\n\n [1] "SSD" "PCIe SSD" "TB SSD" "PCle SSD" "HDD" \n [6] "N/A" "Hybrid Drive" "eMMC" "Flash Memory" NA \n[11] "M.2 PCI" "Flash/SSD" "NVMe M.2" "NVMe M.2 PCI" "Flash" \n[16] "DVDRW" \nRun Code Online (Sandbox Code Playgroud)\n
正如评论和之前的答案中所指出的,您的一些"HDD"和"SSD"价值观包含隐藏字符。
您可以使用该函数识别这些条目tools::showNonASCII(),例如,如果我设置st为您的向量,
tools::showNonASCII(unique(st))
# 7: <e2><80><8e>HDD
# 9: <e2><80><8e>SSD
# 12: NA
Run Code Online (Sandbox Code Playgroud)
要删除任何非 ASCII 字符串,请使用iconv(to = "ASCII", sub = ""):
ascii <- iconv(st, to = "ASCII", sub = "")
tools::showNonASCII(unique(ascii))
# 10: NA
Run Code Online (Sandbox Code Playgroud)