![](/img/trans.png)
[英]Recognize roman numeral followed by '.', space and then capital letter. (RegEx)
[英]Remove spacing if not space is followed by capital letter
我有看起來像這樣的數據:
*first* *last*
M a rk Twain
Hun ter Stockt on Thompson
然后,數據繼續進行n行。 所以我希望數據看起來像這樣:
*first* *last*
Mark Twain
Hunter Stockton Thompson
我知道我可以使用gsub刪除所有這樣的空格:
gsub(" ", "", x, fixed = TRUE)
而且我可以使用正則表達式來識別模式,如下所示:
( [AZ])
但是我如何結合這兩個來對gsub說-刪除所有空格,但在匹配正則表達式的情況下不刪除?
最簡單的方法:
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
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
請參閱R中使用的正則表達式 。 在頁面底部附近給出了對Perl斷言的討論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.