2015-10-06 66 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