2015-10-06 67 views
1

對於這個問題,我有以下的例子是兩個字符串一個矩陣行:R:GSUB有條件地刪除空格

mylist <- rbind("1 Henry Buchanon 45 60 70", "2 Julie Tiscani 80 50 70") 

我想在一個表中這個數據,所以最直接的方式會做的事:

mytable <- read.table(textConnection(mylist)) 

其中一個問題產生下表(對我來說) - 第一個名字和姓氏是在兩個單獨的列(V2和V3)。我更喜歡第二張表的名字和姓在同一列(V2)。

+------------------------------+ 
| V1 V2  V3 V4 V5 V6 | 
+------------------------------+ 
| 1 1 Henry Buchanon 45 60 70 | 
| 2 2 Julie Tiscani 80 50 70 | 
+------------------------------+ 

+------------------------------+ 
| V1    V2 V3 V4 V5 | 
+------------------------------+ 
| 1 1 HenryBuchanon 45 60 70 | 
| 2 2 JulieTiscani 80 50 70 | 
+------------------------------+ 

是否有可能僅省略了姓和名之間的空間(「亨利」和「布坎南」之間如並保持其他空間不變下面的代碼提供了兩個問題:1)代碼刪除搜索條件的字母和2)它只適用於單間距。

gsub("([A-z])[[:space:]]([A-z])", "", mylist) 

+--------------------------------------+ 
| [1,] "1 Henruchanon 45 60 70" | 
+--------------------------------------+ 
| [2,] "2 Julie Tiscani 80 50 70" | 
+--------------------------------------+ 
+2

爲什麼不只是'MYTABLE $名稱< - 粘貼(MYTABLE $ V2,MYTABLE $ V3)' – Chris

+0

嘗試'GSUB(」 (?<= [Az])[[:space:]] +(?= [Az])「,」「,mylist,perl = TRUE)' – nicola

回答

0

我們可以使用gsub創建報價從其他部分隔開的姓/名,然後使用read.table。這將避免在他們之間沒有空格的名字和姓氏。

m1 <- gsub('(?<=\\d\\s)\\s*(?=[A-Z])|(?<=[a-z])\\s*(?=\\s\\d)', 
         "'", mylist, perl=TRUE) 
read.table(text=m1, sep='', header=FALSE) 
# V1    V2 V3 V4 V5 
#1 1 Henry Buchanon 45 60 70 
#2 2 Julie Tiscani 80 50 70 
0

使用您的示例數據的簡單‘paste’將做到這一點:

mytable$V1 <- paste(mytable$V2,mytable$V3); mytable <- mytable[,-c(2:3)] 
mytable 
> mytable 
       V1 V4 V5 V6 
1 Henry Buchanon 45 60 70 
2 Julie Tiscani 80 50 70