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
对于这个问题,我有以下示例,它是一个以两个字符串为行的矩阵:
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