如何修剪前导和尾随空格?

问题描述 投票:330回答:13

我在data.frame中遇到了前导和尾随空格的麻烦。例如,我想基于某种条件来看看row中的特定data.frame

> myDummy[myDummy$country == c("Austria"),c(1,2,3:7,19)] 

[1] codeHelper     country        dummyLI    dummyLMI       dummyUMI       
[6] dummyHInonOECD dummyHIOECD    dummyOECD      
<0 rows> (or 0-length row.names)

我想知道为什么我没有得到预期的产量,因为奥地利国家显然存在于我的data.frame。在查看我的代码历史并试图弄清楚出了什么问题后,我尝试了:

> myDummy[myDummy$country == c("Austria "),c(1,2,3:7,19)]
   codeHelper  country dummyLI dummyLMI dummyUMI dummyHInonOECD dummyHIOECD
18        AUT Austria        0        0        0              0           1
   dummyOECD
18         1

我在命令中改变的是奥地利之后的另一个空格。

显然会出现更烦人的问题。例如,当我想根据国家/地区列合并两个帧时。一个data.frame使用"Austria ",而另一个框架有"Austria"。匹配不起作用。

  1. 有没有一种很好的方式来“显示”我的屏幕上的空白,以便我知道这个问题?
  2. 我可以删除R中的前导和尾随空格吗?

到目前为止,我曾经写过一个简单的Perl脚本,它删除了空格,但如果我可以在R里面以某种方式做到这一点会很好。

r whitespace trim removing-whitespace built-in
13个回答
435
投票

可能最好的方法是在读取数据文件时处理尾随空格。如果你使用qazxsw poi或qazxsw poi你可以设置参数qazxsw poi。

如果您想在之后清理字符串,可以使用以下函数之一:

read.csv

要在read.table上使用以下功能之一:

strip.white=TRUE

要“显示”您可以使用的空白:

# returns string w/o leading whitespace
trim.leading <- function (x)  sub("^\\s+", "", x)

# returns string w/o trailing whitespace
trim.trailing <- function (x) sub("\\s+$", "", x)

# returns string w/o leading or trailing whitespace
trim <- function (x) gsub("^\\s+|\\s+$", "", x)

它将显示由引号(“)包围的字符串,使空格更容易被发现。


1
投票

我创建了一个> a <- " a string with lots of starting, inter mediate and trailing whitespace " 函数来修剪前导和/或尾随空格:

split

为了说明,

> strsplit(a, split=" +")
[[1]]
 [1] ""           "a"          "string"     "with"       "lots"      
 [6] "of"         "starting,"  "inter"      "mediate"    "and"       
[11] "trailing"   "whitespace"

1
投票

最好的方法是trimws()

以下代码将此函数应用于整个数据帧

mydataframe < - data.frame(lapply(mydataframe,trimws),stringsAsFactors = FALSE)


1
投票

我试过trim()。适用于空白区域和'\ n'。 x ='\ n哈登,J。\ n'

修剪(x)的


0
投票
trim.strings ()

在此之后,你需要强制R不要将“奥地利”识别为一个级别。让我们假装你也有“美国”和“西班牙”作为关卡:

# Arguments:    x - character vector
#            side - side(s) on which to remove whitespace 
#                   default : "both"
#                   possible values: c("both", "leading", "trailing")

trim.strings <- function(x, side = "both") { 
    if (is.na(match(side, c("both", "leading", "trailing")))) { 
      side <- "both" 
      } 
    if (side == "leading") { 
      sub("^\\s+", "", x)
      } else {
        if (side == "trailing") {
          sub("\\s+$", "", x)
    } else gsub("^\\s+|\\s+$", "", x)
    } 
} 

比最高投票反应少一点恐吓,但它应该仍然有效。


485
投票

从R 3.2.0开始,引入了一个用于删除前导/尾随空格的新函数:

myDummy$country

见: myDummy$country <- trim(myDummy$country)


84
投票

要操作空格,请在stringr包中使用str_trim()。该软件包的手册日期为2013年2月15日,并且在CRAN中。该函数还可以处理字符串向量。

 paste(myDummy$country)

(学分归于评论者:R。Cotton)


23
投票

一个删除前导和尾随空格的简单函数:

trimws()

用法:

http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html

11
投票

ad1)要查看空格,您可以使用修改后的参数直接调用install.packages("stringr", dependencies=TRUE) require(stringr) example(str_trim) d4$clean2<-str_trim(d4$V2)

trim <- function( x ) {
  gsub("(^[[:space:]]+|[[:space:]]+$)", "", x)
}

另请参阅> text = " foo bar baz 3 " > trim(text) [1] "foo bar baz 3" 了解其他选项。


9
投票

使用grep或grepl查找带有空格和子的观察结果以消除它们。

print.data.frame

5
投票

我更愿意将答案作为评论添加到user56,但却无法写作独立答案。删除前导和尾随空白也可以通过gdata包中的trim()函数来实现:

print(head(iris), quote=TRUE)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width  Species
# 1        "5.1"       "3.5"        "1.4"       "0.2" "setosa"
# 2        "4.9"       "3.0"        "1.4"       "0.2" "setosa"
# 3        "4.7"       "3.2"        "1.3"       "0.2" "setosa"
# 4        "4.6"       "3.1"        "1.5"       "0.2" "setosa"
# 5        "5.0"       "3.6"        "1.4"       "0.2" "setosa"
# 6        "5.4"       "3.9"        "1.7"       "0.4" "setosa"

用法示例:

?print.data.frame

5
投票

另一种选择是使用names<-c("Ganga Din\t","Shyam Lal","Bulbul ") grep("[[:space:]]+$",names) [1] 1 3 grepl("[[:space:]]+$",names) [1] TRUE FALSE TRUE sub("[[:space:]]+$","",names) [1] "Ganga Din" "Shyam Lal" "Bulbul" 包中的require(gdata) example(trim) 函数,该函数默认为删除前导和尾随空格:

> trim("   Remove leading and trailing blanks    ")
[1] "Remove leading and trailing blanks"

要仅删除前导空格,请使用stri_trim。要仅删除尾随空格,请使用stringi。如果要删除其他前导或尾随字符,则必须使用> x <- c(" leading space","trailing space ") > stri_trim(x) [1] "leading space" "trailing space" 指定。

有关更多信息,请参阅stri_trim_left


4
投票

如果输入之间有多个空格,则会出现另一个相关问题:

stri_trim_right

然后,您可以使用正则表达式将此字符串轻松拆分为“真实”标记到pattern =参数:

?stri_trim

请注意,如果在(非空)字符串的开头存在匹配项,则输出的第一个元素为“”“,但如果字符串末尾存在匹配项,则输出结果与随着比赛被删除。

© www.soinside.com 2019 - 2024. All rights reserved.