所以" xx yy 11 22 33 "会变成"xxyy112233".我怎样才能做到这一点?

推荐答案

一般来说,我们需要一个矢量化的解决方案,所以这里有一个更好的测试示例:

whitespace <- " \t\n\r\v\f" # space, tab, newline, 
                            # carriage return, vertical tab, form feed
x <- c(
  " x y ",           # spaces before, after and in between
  " \u2190 \u2192 ", # contains unicode chars
  paste0(            # varied whitespace     
    whitespace, 
    "x", 
    whitespace, 
    "y", 
    whitespace, 
    collapse = ""
  ),   
  NA                 # missing
)
## [1] " x y "                           
## [2] " ← → "                           
## [3] " \t\n\r\v\fx \t\n\r\v\fy \t\n\r\v\f"
## [4] NA

The base R approach: gsub

gsub用另一个字符串替换字符串(fixed = TRUE)或正则表达式(fixed = FALSE,默认值)的所有实例.要删除所有空格,请使用:

gsub(" ", "", x, fixed = TRUE)
## [1] "xy"                            "←→"             
## [3] "\t\n\r\v\fx\t\n\r\v\fy\t\n\r\v\f" NA 

正如DWin所指出的,在这种情况下,fixed = TRUE不是必需的,但提供了更好的性能,因为匹配固定字符串比匹配正则表达式更快.

如果要删除所有类型的空白,请使用:

gsub("[[:space:]]", "", x) # note the double square brackets
## [1] "xy" "←→" "xy" NA 

gsub("\\s", "", x)         # same; note the double backslash

library(regex)
gsub(space(), "", x)       # same

"[:space:]"是与所有空格字符匹配的特定于R的正则表达式组.\s是一个独立于语言的正则表达式,它也做同样的事情.


The stringr approach: str_replace_all and str_trim

stringr围绕基本R函数提供了更多人类可读的包装(尽管截至2014年12月,开发版本在stringi之上构建了一个分支,如下所述).使用[str_replace_all][3]]的上述命令的类似功能为:

library(stringr)
str_replace_all(x, fixed(" "), "")
str_replace_all(x, space(), "")

stringr还有一个str_trim函数,只删除前导和尾随空格.

str_trim(x) 
## [1] "x y"          "← →"          "x \t\n\r\v\fy" NA    
str_trim(x, "left")    
## [1] "x y "                   "← → "    
## [3] "x \t\n\r\v\fy \t\n\r\v\f" NA     
str_trim(x, "right")    
## [1] " x y"                   " ← →"    
## [3] " \t\n\r\v\fx \t\n\r\v\fy" NA      

The stringi approach: stri_replace_all_charclass and stri_trim

stringi构建在独立于平台的ICU library上,并具有一系列广泛的字符串操作功能.上述equivalents项是:

library(stringi)
stri_replace_all_fixed(x, " ", "")
stri_replace_all_charclass(x, "\\p{WHITE_SPACE}", "")

这里"\\p{WHITE_SPACE}"是一组被认为是空白的Unicode代码点的替代语法,相当于"[[:space:]]""\\s"space().对于更复杂的正则表达式替换,还有stri_replace_all_regex个.

stringi也有trim functions个.

stri_trim(x)
stri_trim_both(x)    # same
stri_trim(x, "left")
stri_trim_left(x)    # same
stri_trim(x, "right")  
stri_trim_right(x)   # same

R相关问答推荐

使用列表列作为case_when LHS的输入

将虚线添加到每个站点的传奇中平均

混淆矩阵,其中每列和等于1

在ggplot Likert条中添加水平线

如何使用stat_extract_all正确提取我的目标值?

R Markdown中的交叉引用表

R中的子集文件—读取文件名索引为4位数字序列,例如0001到4000,而不是1到4000)

使用gcuminc,如何使用逗号格式化风险表?

将向量组合到一个数据集中,并相应地命名行

如何在一次运行中使用count进行多列计数

如何使用ggplot对堆叠条形图进行嵌套排序?

如何使用tryCatch执行语句并忽略警告?

在另一个包中设置断点&S R函数

从多个可选列中选取一个值到一个新列中

停止ggplot将多行减少到一行

如何对r中包含特定(未知)文本的行求和?

删除字符串R中的重复项

数值型数据与字符混合时如何进行绑定

当由base::限定时,`[.factor`引发NextMethod错误

按组使用dummy r获取高于标准的行的平均值