查找字符串中的空格数

时间:2012-09-13 09:31:20

标签: string r

如何根据空间创建不同的列,例如:“我要出去”

ANs 3
Column1 Column2 Column3 Column14 
I          am     going    out

4 个答案:

答案 0 :(得分:15)

如果你想要实际的列值,如你的例子所示,那么你可以从文本连接中读取一个表:

> read.table(textConnection("I am going Out"))
  V1 V2    V3  V4
1  I am going Out

要回答问题的标题,即有多少个空格,您可以使用ncol计算上述列,然后减去一个。但是,如果您对空格数感兴趣,则以下内容更有效:

length(gregexpr(" ", "I am going Out")[[1]])

这使用正则表达式来搜索空格。

[[1]]获取结果列表的第一个元素,它对应于输入向量的第一个项目,其中“我要外出”作为其唯一元素。如果你在那里传递了一个不同的向量,你的列表可能有多个元素,或者对于一个空向量都没有。

如果没有空格,gregexpr仍会返回长度为1的列表,其中-1为匹配位置,表示没有匹配。这会导致上述代码在这种情况下错误地报告一个结果。一个更精细的解决方案,处理它并接受矢量作为输入,如下:

countSpaces <- function(s) { sapply(gregexpr(" ", s), function(p) { sum(p>=0) } ) }

该函数的工作原理如下:gregexpr将返回结果的列表,一个用于输入 vector s的每个元素。 sapply将迭代该列表,并为列表中的每个元素计算匹配数。它不使用匹配位置向量的length进行计数,而是使用sum仅计算非负值,从而丢弃由失败匹配引起的任何-1。该总和中发生了从FALSE/TRUE0/1的隐式转换。 sapply的结果将再次成为一个向量,因此很好地匹配输入向量。

此功能可用于重写数据帧,如one comment中所述。因此,假设您有一个名为foo的数据框,其中包含bar列中的字符串,并且应修改为在新列baz中包含这些计数。您可以将其写为

foo <- transform(foo, baz = countSpaces(bar))

答案 1 :(得分:3)

另一种方法是使用strsplit函数:

R> strsplit("I am going Out", " ")[[1]]
[1] "I"     "am"    "going" "Out"  

所以我们将第一个参数 - I am going Out - 用第二个参数 - 空格分开。然后我们可以使用length

R> length(strsplit("I am going Out", " ")[[1]])
[1] 4

答案 2 :(得分:3)

我必须承认我没有仔细阅读,所以这可能不是你想要的,但可能性是......

x <- "I am going Out"
nchar(x)- nchar(gsub(" ", "", x))

MvG原始建议的替代方案(虽然不那么漂亮):

as.data.frame(matrix(unlist(strsplit("I am   going Out", "\\s+", perl=TRUE)), nrow=1))

答案 3 :(得分:2)

您还可以使用str_count包中的stringr。这些都不那么冗长,避免正则表达式会更快一些。

library(stringr)
text = "I am going Out"
#matches regular expression
str_count(text, ' ')

或者,如果你想要更快的东西

#matches literal text
str_count(text, fixed(' '))