例如,我想根据特定条件查看
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中完成它,那将是很好的。
#1 楼
最好的方法可能是在读取数据文件时处理尾随空格。如果使用read.csv
或read.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
评论
我刚刚看到sub()也使用Perl表示法。对于那个很抱歉。我将尝试使用该功能。但是对于我的第一个问题,我还没有解决方案。正如hadley指出的那样,此正则表达式“ ^ \\ s + | \\ s + $”将标识前导和尾随空格。因此x <-gsub(“ ^ \\ s + | \\ s + $”,“”,x)许多R的读取函数都具有以下选项:strip.white = FALSE