How to trim leading and trailing whitespace?
我在data.frame中遇到了前导和尾随空格的麻烦。
例如,我想基于某个条件查看
1 2 3 4 5 | > 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) |
我想知道为什么我没有得到预期的输出,因为奥地利显然存在于我的
1 2 3 4 5 | > 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 |
我在命令中改变的是奥地利之后的另一个空格。
显然会出现更烦人的问题。例如,当我想根据国家/地区列合并两个帧时。一个
到目前为止,我曾经写过一个简单的
从R 3.2.0开始,引入了一个用于删除前导/尾随空格的新函数:
1 | trimws() |
请参阅:http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html
可能最好的方法是在读取数据文件时处理尾随空格。如果使用
如果您想在之后清理字符串,可以使用以下函数之一:
1 2 3 4 5 6 7 8 | # 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 | myDummy$country <- trim(myDummy$country) |
要"显示"您可以使用的空白:
1 | paste(myDummy$country) |
它将显示由引号(")包围的字符串,使空格更容易被发现。
要操作空格,请在stringr包中使用str_trim()。
该软件包的手册日期为2013年2月15日,并且在CRAN中。
该函数还可以处理字符串向量。
1 2 3 4 | install.packages("stringr", dependencies=TRUE) require(stringr) example(str_trim) d4$clean2<-str_trim(d4$V2) |
(学分归于评论者:R。Cotton)
一个删除前导和尾随空格的简单函数:
1 2 3 | trim <- function( x ) { gsub("(^[[:space:]]+|[[:space:]]+$)","", x) } |
用法:
1 2 3 | > text =" foo bar baz 3" > trim(text) [1]"foo bar baz 3" |
ad1)要查看空格,您可以使用修改后的参数直接调用
1 2 3 4 5 6 7 8 | 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" |
有关其他选项,另请参阅
使用grep或grepl查找带有空格和子的观察结果以消除它们。
1 2 3 4 5 6 7 | 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" |
另一种选择是使用
1 2 3 | > x <- c(" leading space","trailing space ") > stri_trim(x) [1]"leading space" "trailing space" |
要仅删除前导空格,请使用
有关详细信息,另请参见
我更愿意将答案作为评论添加到user56,但却无法写作独立答案。
删除前导和尾随空白也可以通过gdata包中的trim()函数来实现:
1 2 | require(gdata) example(trim) |
用法示例:
1 2 | > trim(" Remove leading and trailing blanks ") [1]"Remove leading and trailing blanks" |
如果输入之间有多个空格,则会出现另一个相关问题:
1 | > a <-" a string with lots of starting, inter mediate and trailing whitespace " |
然后,您可以使用正则表达式轻松地将此字符串拆分为"真实"标记到
1 2 3 4 5 | > strsplit(a, split=" +") [[1]] [1]"" "a" "string" "with" "lots" [6]"of" "starting," "inter" "mediate" "and" [11]"trailing" "whitespace" |
请注意,如果在开头有匹配项
一个(非空)字符串,输出的第一个元素是'"',但是
如果字符串末尾有匹配,则输出为
与删除的匹配相同。
我创建了一个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 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) } } |
为了说明,
1 2 3 4 5 6 7 8 9 10 11 12 13 | a <- c(" ABC123 456 "," ABC123DEF ") # returns string without leading and trailing whitespace trim.strings(a) # [1]"ABC123 456""ABC123DEF" # returns string without leading whitespace trim.strings(a, side ="leading") # [1]"ABC123 456 " "ABC123DEF " # returns string without trailing whitespace trim.strings(a, side ="trailing") # [1]" ABC123 456"" ABC123DEF" |
我试过trim()。适用于空白区域和' n'。
x =' n哈登,J。 n'
修剪(x)的
最好的方法是trimws()
以下代码将此函数应用于整个数据帧
mydataframe<- data.frame(lapply(mydataframe, trimws),stringsAsFactors = FALSE)
1 | myDummy[myDummy$country =="Austria"] <-"Austria" |
在此之后,你需要强制R不要将"奥地利"识别为一个级别。让我们假装你也有"美国"和"西班牙"作为关卡:
1 | myDummy$country = factor(myDummy$country, levels=c("Austria","USA","Spain")) |
比最高投票反应少一点恐吓,但它应该仍然有效。