R語言資料處理(二)字元分隔

shuaishuai3409發表於2015-12-04

現有match表,
v1 v2
1 001;02
2 03,004;001
3 003;002,001
我想把match表中V2這一列的資料分隔開,形成表match_new:

V1 V2 V3 V4
1 001 02
2 03 004 001
3 003 002 001
需要注意的是原match表中v2這一列裡的資料有的以“;”分隔,有的以“,”分隔。

程式碼一
a <- data.frame(v1 = 1:3, V2 = c('001;02', '03,004;001', '003;002,001'), V3 = NA, V4 = NA, stringsAsFactors = F )
for(i in 1:nrow(a)){
l <- strsplit(a[i, 2], ',')
l <- strsplit(l[[1]], ';')
s <- l[[1]]
if(length(l)>1)
for(n in 2:length(l)){
s <- c(s, l[[n]])
}
a[i,2:(1+length(s))] <- s
}


程式碼二
> match<-data.frame(V1=c(1,2,3),v2=c('001;002','003,004;001','003;002,001'))
> match
  V1          v2
1  1     001;002
2  2 003,004;001
3  3 003;002,001
> 
> parts<-function(x) {
+     m <- regexec("([0-9]+)(;|,)*([0-9]*)(;|,)*([0-9]*)", x)
+     parts <- unlist(lapply(regmatches(x, m), `[`,  c(2L, 4L, 6L)))
+     parts
+ }
> 
> rr<-do.call(rbind,lapply(as.character(match$v2),parts))
> colnames(rr)<-c("V2","V3","V4")
> cbind(V1=match$V1,rr)
     V1  V2    V3    V4   
[1,] "1" "001" "002" ""   
[2,] "2" "003" "004" "001"
[3,] "3" "003" "002" "001"

相關文章