2012-09-13 26 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(' '))