2012-09-13 23 views
6

我怎样才能的空间的基础上创建不同的栏目,如:“我走出去”找到的空格数的字符串

ANs 3 
Column1 Column2 Column3 Column14 
I   am  going out 
+0

也许你想'read.fwf'虽然我不知道你是什么之后。 –

回答

14

如果你想实际的列值,作为你的例子似乎来表示,那么你就可以从文本连接读取表:

> 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]]将结果列表的第一个元素作为结果列表的第一个元素,它对应于输入向量的第一个项目,其中“I am Out”作为其唯一元素。如果你在那里传递了一个不同的矢量,你的列表可能有多个元素,或者根本没有空元素。

如果没有空格,gregexpr仍然会返回一个长度为1的列表,并将-1作为匹配的位置以指示不存在匹配。这会导致上述代码在该情况下错误地报告一个结果。一个更复杂的解决方案,这与优惠和也接受矢量作为输入,如下:

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

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

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

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

+1。这取决于他们想要什么,但这可能更合适:length(gregexpr(“[] +”,“我要出去”)[[1]])(答案= 3)。用这个短语(有额外的空格),你使用的方法计算每个空格。 – A5C1D2H2I1M1N2O1R2T1

+1

嗯。你如何在评论中添加多个空格? – A5C1D2H2I1M1N2O1R2T1

+2

@mrdwab,请参阅http://meta.stackexchange.com/questions/30020/multiple-spaces-in-code-in-comments-get-merged-into-one。解决方法:使用非空格空格,作为U + 00A0 unicode代码点输入。 – MvG

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 
+0

但我们不想知道单词的数量。所以我认为MvG的回答更合适。 – rinni

+0

我同意@ MvG的回答比较好,但是我不会对“我们不知道字数” – csgillespie

+0

的意见进行评论嗯,我们想知道_spaces_的数量,而不是_words_的数量。你计算单词的数量。 – rinni

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)) 
1

您还可以使用str_countstringr包。这些不太详细,避免正则表达式可以快一点。

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

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

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