我在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"。匹配不起作用。

是否有一种很好的方法可以在屏幕上“显示”空白,以便我意识到问题所在?
我可以删除前导和

到目前为止,我曾经写过一个简单的Perl脚本,它消除了白色的速度,但是如果我能以某种方式在R中完成它,那将是很好的。

评论

我刚刚看到sub()也使用Perl表示法。对于那个很抱歉。我将尝试使用该功能。但是对于我的第一个问题,我还没有解决方案。

正如hadley指出的那样,此正则表达式“ ^ \\ s + | \\ s + $”将标识前导和尾随空格。因此x <-gsub(“ ^ \\ s + | \\ s + $”,“”,x)许多R的读取函数都具有以下选项:strip.white = FALSE

#1 楼

最好的方法可能是在读取数据文件时处理尾随空格。如果使用read.csvread.table,则可以设置参数strip.white=TRUE
如果以后要清理字符串,则可以使用以下功能之一:
# Returns string without leading white space
trim.leading <- function (x)  sub("^\s+", "", x)

# Returns string without trailing white space
trim.trailing <- function (x) sub("\s+$", "", x)

# Returns string without leading or trailing white space
trim <- function (x) gsub("^\s+|\s+$", "", x)

要在myDummy$country上使用以下功能之一:
 myDummy$country <- trim(myDummy$country)


要“显示”空白,您可以使用:
 paste(myDummy$country)

,它将为您显示带引号(“)括起来的字符串,从而使空白更容易发现。

评论


正如hadley指出的那样,此正则表达式“ ^ \\ s + | \\ s + $”将标识前导和尾随空格。因此x <-gsub(“ ^ \\ s + | \\ s + $”,“”,x)许多R的读取函数都具有以下选项:strip.white = FALSE

–杰伊
2010-2-14在15:10



另请参见stringr软件包中的str_trim。

– Richie Cotton
2010-2-16在15:35

再加上一个“现在已修剪功能供将来使用”-谢谢!

–克里斯·比利(Chris Beeley)
2012年1月17日上午9:56

不幸的是,strip.white = TRUE仅适用于未引用的字符串。

–罗德里戈
15年8月10日在15:08

在R 3.2.0中,有一种更简单的方法来修剪空白。查看下一个答案!

– Alex
15年12月29日在16:06

#2 楼

从R 3.2.0开始,引入了一个用于删除前导/尾随空白的新功能:
trimws()

请参阅:删除前导/尾随空白

评论


这取决于最佳答案的定义。这个答案很高兴知道(+1),但是在快速测试中,它的速度不及那里的一些替代方法。

– A5C1D2H2I1M1N2O1R2T1
15年5月24日在8:05

尽管\ n处于覆盖字符类中,但它似乎不适用于多行字符串。 trimws(“ SELECT \ n blah \ n FROM foo;”)仍包含换行符。

– Jubbles
2015年12月31日在1:10



@Jubbles这是预期的行为。在传递给修剪的字符串中,没有前导或尾随空格。如果要从字符串的每一行中删除开头和结尾的空格,则必须首先将其拆分。像这样:trimws(strsplit(“ SELECT \ n blah \ n FROM foo;”,“ \ n”)[[1]])

–wligtenberg
15年12月31日在8:20

尽管R的最新版本具有内置功能,但它实际上只是在后台执行PERL样式的正则表达式。我可能期望一些快速的自定义C代码可以做到这一点。 trimws regex可能足够快。 stringr :: str_trim(基于stringi)也很有趣,因为它使用了完全独立的国际化字符串库。您会认为空白将不受国际化问题的影响,但我想知道。我从未见过将本机与Stringr / Stringi或任何基准进行比较的结果。

–杰克·沃西(Jack Wasey)
16年1月30日在17:31

由于某种原因,我无法弄清楚,trimws()并未删除我的前导空白,而下面的Bryan的trim.strings()(我只有1票!)确实...

–PatrickT
18年3月3日在22:16

#3 楼

要操纵空白,请在stringr程序包中使用str_trim()。
程序包的日期为2013年2月15日,位于CRAN中。
该函数还可以处理字符串向量。
install.packages("stringr", dependencies=TRUE)
require(stringr)
example(str_trim)
d4$clean2<-str_trim(d4$V2)

(贷方为评论员:R。Cotton)

评论


此解决方案删除了​​一些trimws()无法删除的突变空白。

–理查德·特尔福德
16-11-24在20:52

@RichardTelford您能举个例子吗?因为那可能被认为是修整中的错误。

–wligtenberg
17年2月21日在12:15

IMO这是最好的解决方案。没有太多的代码和高性能

–彼得
19年11月21日在9:22

感谢require(stringr)他们的文档或示例没有此必需的代码行!

–pgee70
3月18日下午1:28

#4 楼

删除前导和尾随空格的简单功能:

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



> text = "   foo bar  baz 3 "
> trim(text)
[1] "foo bar  baz 3"


#5 楼

广告1)要查看空格,您可以直接使用修改后的参数调用print.data.frame
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

#6 楼

使用grep或grepl查找带有空格的观测值,并使用sub摆脱它们。
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"


评论


或者,更简洁些,“ ^ \\ s + | \\ s + $”

–哈德利
2010-2-14在14:45



只是想指出,必须使用gsub而不是使用hadley的regexp的sub。使用sub只会在没有前导空格的情况下删除尾随空格...

– f3lix
2010-2-14在15:50

不知道您可以在perl = FALSE中使用\ s等。文档说在这种情况下使用POSIX语法,但是接受的语法实际上是TRE regex库laurikari.net/tre/documentation/regex-syntax定义的超集。

– Jyotirmoy Bhattacharya
2010-2-14在18:37

#7 楼

也可以通过gdata包中的trim()函数删除开头和结尾的空格:
require(gdata)
example(trim)

用法示例:
> trim("   Remove leading and trailing blanks    ")
[1] "Remove leading and trailing blanks"

我希望添加答案作为对user56的评论,但我仍无法以此作为独立答案。

#8 楼

另一种选择是使用stri_trim软件包中的stringi函数,该函数默认删除前导和尾随空格:

> x <- c("  leading space","trailing space   ")
> stri_trim(x)
[1] "leading space"  "trailing space"


仅删除前导空格,请使用stri_trim_left。仅删除尾随空格,请使用stri_trim_right。如果要删除其他前导或尾随字符,则必须使用pattern =进行指定。

有关更多信息,另请参见?stri_trim

#9 楼

如果在输入之间有多个空格,则会发生另一个相关问题:
> 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"

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

#10 楼

我创建了一个trim.strings ()函数来将前导和/或尾随空格修剪为:

# 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)
    } 
} 


为说明起见,

#11 楼

最好的方法是trimws()。
以下代码将将此函数应用于整个数据帧。
mydataframe<- data.frame(lapply(mydataframe, trimws),stringsAsFactors = FALSE)


评论


或df [] <-lapply(df,trimws)更紧凑。但是,在两种情况下,它都会将列强制转换为字符。 df [sapply(df,is.character)] <-lapply(df [sapply(df,is.character)],trimws)是安全的。

– Moody_Mudskipper
18年7月13日在20:07



#12 楼

我尝试过trim()。它适用于空格以及'\ n'。
x = '\n              Harden, J.\n              '

trim(x)


评论


从哪个包?默认情况下不存在此功能。

–TMS
8月18日7:48

#13 楼

myDummy[myDummy$country == "Austria "] <- "Austria"

此后,您需要强制R不要将"Austria "识别为水平。让我们假设您还有"USA""Spain"的级别:

评论


我认为这不是一个好主意,因为我们不知道df实际有多少个国家/级别。此外,R会将Dummy $ Country的第一个元素编码为“奥地利”,即使它是“西班牙”也是如此。

– Gmichael
9月17日晚上8:55