我想在前两个冒号上拆分一列字符串,但不要在任何后续冒号上拆分:
my.data <- read.table(text='
my.string some.data
123:34:56:78 -100
87:65:43:21 -200
a4:b6:c8888 -300
11:bbbb:ccccc -400
uu:vv:ww:xx -500', header = TRUE)
desired.result <- read.table(text='
my.string1 my.string2 my.string3 some.data
123 34 56:78 -100
87 65 43:21 -200
a4 b6 c8888 -300
11 bbbb ccccc -400
uu vv ww:xx -500', header = TRUE)
Run Code Online (Sandbox Code Playgroud)
我进行了广泛的搜索,以下问题最接近我目前的困境:
谢谢你的任何建议。我更喜欢使用基础 R。
编辑:
第一个冒号之前的字符数并不总是两个,前两个冒号之间的字符数也不总是两个。所以,我编辑了这个例子来反映这一点。
在基数 R 中:
> my.data <- read.table(text='
+
+ my.string some.data
+ 123:34:56:78 -100
+ 87:65:43:21 -200
+ a4:b6:c8888 -300
+ 11:bbbb:ccccc -400
+ uu:vv:ww:xx -500', header = TRUE,stringsAsFactors=FALSE)
> m <- regexec ("^([^:]+):([^:]+):(.*)$",my.data$my.string)
> my.data$my.string1 <- unlist(lapply(regmatches(my.data$my.string,m),'[',c(2)))
> my.data$my.string2 <- unlist(lapply(regmatches(my.data$my.string,m),'[',c(3)))
> my.data$my.string3 <- unlist(lapply(regmatches(my.data$my.string,m),'[',c(4)))
> my.data
my.string some.data my.string1 my.string2 my.string3
1 123:34:56:78 -100 123 34 56:78
2 87:65:43:21 -200 87 65 43:21
3 a4:b6:c8888 -300 a4 b6 c8888
4 11:bbbb:ccccc -400 11 bbbb ccccc
5 uu:vv:ww:xx -500 uu vv ww:xx
Run Code Online (Sandbox Code Playgroud)
您会看到我已经用来stringsAsFactors=FALSE确保my.string可以将其作为字符串向量进行处理。