2016-04-19 71 views
0

我有數據,看起來像這樣:刪除間距如果沒有空間後跟大寫字母

*first*    *last* 
M a rk    Twain 
Hun ter    Stockt on Thompson 

的數據,那麼持續ň行的數量。所以,我希望數據是這樣的:

*first*    *last* 
Mark     Twain 
Hunter    Stockton Thompson 

我知道我可以使用GSUB刪除所有類似的blankspaces:

gsub(" ", "", x, fixed = TRUE) 

我可以用這樣的正則表達式識別模式:

([A-Z])

但我怎麼能結合這兩種要說到GSUB - 刪除所有空格,但不是在它的正則表達式匹配的情況?

+0

如何利用的[這](https://regex101.com/r/fF8kW1/2)來匹配你想從中間想要什麼? – Konrad

回答

0
df <- data.frame(`*first*`=c('M a rk','Hun ter'),`*last*`=c('Twain','Stockt on Thompson'),check.names=F,stringsAsFactors=F); 
df; 
## *first*    *last* 
## 1 M a rk    Twain 
## 2 Hun ter Stockt on Thompson 

我會用一個Perl式斷言:

for (ci in seq_along(df)) df[[ci]] <- gsub(perl=T,' (?![A-Z])','',df[[ci]]); 
df; 
## *first*   *last* 
## 1 Mark    Twain 
## 2 Hunter Stockton Thompson 

Regular Expressions as used in R。關於Perl斷言的討論在頁面底部附近給出。

1

最簡單的方法:

txt <- c("M a rk", "Twain", "Hun ter", "Stockt on Thompson") 
gsub("\\s([a-z])", "\\1", txt) 
## [1] "Mark"    "Twain"    "Hunter"   "Stockton Thompson" 

如果你想在這個data.frame應用到多個變量,則可以使用lapply做到這一點,列表尋址一個data.frame替換功能。 (注:你真的不應該在data.frame列的名稱使用星號)

df <- data.frame("*first*" = c("M a rk", "Hun ter"), 
       "*last*" = c("Twain", "Stockt on Thompson"), 
       check.names = FALSE, stringsAsFactors = FALSE) 

# names of the text columns you want to clean up 
varsToModify <- c("*first*", "*last*") 

df[varsToModify] <- lapply(df[varsToModify], 
          function(x) gsub("\\s([a-z])", "\\1", x)) 
df 
## *first*   *last* 
## 1 Mark    Twain 
## 2 Hunter Stockton Thompson 
+0

我可以在多列的數據框中使用它嗎? – useriama

+0

是的,我加入了答案來說明如何做到這一點。 –

相關問題