R: Gsub 有条件地删除空格

R: Gsub to conditionally remove spaces

对于这个问题,我有以下示例,它是一个以两个字符串为行的矩阵:

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

我想要 table 中的这些数据,所以最直接的方法是:

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

产生以下 table 有一个问题(对我来说)——名字和姓氏在两个单独的列中(V2 和 V3)。我更喜欢第二个 table 之类的东西,其中名字和姓氏在同一列 (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  |
+------------------------------+

是否可以仅省略名字和姓氏之间的 space(例如 "Henry" 和 "Buchanon" 之间的 space 并保持其他 space 不变?以下代码存在两个问题:1) 代码删除了搜索条件的字母和 2) 它仅适用于单间距。

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

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

我们可以使用 gsub 创建引号将第一个 name/last 名称与其余名称分开,然后使用 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

使用您的示例数据,一个简单的 ‘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