R 中的空格类型

Types of Whitespace in R

我的问题是关于 R 中的空格。关于 R 中的空格有很多问题,但我还没有发现任何关于 类型 的空格产生不一致行为的问题。

我从维基百科中抓取了一个 table,我试图将带有空格的列(例如,Minnesota 6)分成两列(c(Minnesota, 6))。我尝试使用 tidyr 的 separate() 函数并收到令人抓狂的错误消息 Expected 2 pieces. Missing pieces filled with NA in 364 rows ... 似乎 separate() 无法将数字前的空格识别为空格。有趣的是,它 确实 识别州名中的空格(例如纽约州南达科他州)。

产生错误的代码:

reps %<>% 
  clean_names() %>% 
  separate(district, into = c('state', 'd'), sep = '\s', remove = FALSE)

然而,当我 运行 sum(str_detect(reps$District, '\s')) 我得到 435,这是行数。所以它正在检测数字前的空格。

进一步的转折。当我将数据框导出到 .csv 然后读入时,separate() 的问题消失了。但是,我还是想知道这个看不见的问题是什么。

Here you can find the .rds and here .csv,如果你喜欢那种东西。

您可以使用tools::showNonASCII函数显示non-ascii个字符。这是我看到的:

> tools::showNonASCII(head(reps$District))
1: Alabama<c2><a0>1
2: Alabama<c2><a0>2
3: Alabama<c2><a0>3
4: Alabama<c2><a0>4
5: Alabama<c2><a0>5
6: Alabama<c2><a0>6

因此这些条目具有 UTF-8 代码 C2 A0,即 non-breaking space。您可以使用

将其转换为标准 space
reps$District <- sub("\ua0", " ", reps$District)

(根据 http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=c2+a0&mode=bytes,UTF-8 C2 A0 是代码点 00A0)。

您的问题标题是“R 中的白色类型space”,它的定义并不明确。不同的函数使用不同的定义。您必须阅读文档或源代码才能找出 separate 函数认为 '\s' 的含义。 Base R 支持多种正则表达式样式;参见 ?regex