2015-07-21 91 views
2

我有一个数据帧,看起来像这样:- [R分裂一列一分为二,当分隔符是“..”

 X1      X3 
1: thrL    190..255 
2: thrA    337..2799 
3: thrB    2801..3733 
4: thrC    3734..5020 
5: yaaX    5234..5530 
6: yaaA complement(5683..6459) 
7: yaaJ complement(6529..7959) 

我在努力此数据帧分离成使用..作为隔板三列。我已经尝试过类似帖子上的其他解决方案,如splitstackshapegsub,但是没有一个真正起作用,因为这些用于分隔符不是通配符值(例如句点)的情况。

 X1 X2 X3 X4 
1: thrL 190 255 f 
2: thrA 337 2799 f 
3: thrB 2801 3733 f 
4: thrC 3734 5020 f 
5: yaaX 5234 5530 f 
6: yaaA 5683 6459 r 
7: yaaJ 6529 7959 r 

这就是我想现在

concat.split.multiple(i, "X3", "\\.\\.") 

有什么建议?

在此先感谢

+1

而在'complement(1234..5678)'的情况下,你只是想忽略'补充'? –

+0

我编辑了我想要的输出以使它更清晰,对于有补码的行,可以添加另一行X4 – ALKI

+0

'with(dd,cbind(X1,read.table(text = gsub('\\ D','' (dd,cbind(X1,read.table(text = gsub('\\ D','',X3)),X4 = c('f')X3))))' – rawr

回答

1

使用dplyrtidyr

library(dplyr) 
library(tidyr) 
df %>% 
    mutate(X4=ifelse(grepl("complement", X3), "f", "r")) %>% 
    mutate(X3=gsub("[a-z()]", "", X3)) %>% 
    separate(X3, into=c("X2", "X3"), sep="\\.\\.") 
1

这是一个基本的R解决方案。 在你的strsplit中使用fixed=T在字面点而不是点作为通配符分割。您可以使用(例如)grepl来检测“补充”。

例如

# reproducible example 
set.seed(1) 
mydf <- data.frame(X1=letters[1:7], X3=paste0(sample(100, 7), '..', sample(100, 7)), stringsAsFactors=F) 
mydf$X3[6:7] <- paste0('complement(', mydf$X3[6:7], ')') 

# X1     X3 
# 1 a    27..67 
# 2 b    37..63 
# 3 c    57..7 
# 4 d    89..20 
# 5 e    20..17 
# 6 f complement(86..66) 
# 7 g complement(97..37) 

检测complement(..)

mydf$X4 <- ifelse(grepl('complement\\(', mydf$X3), 'r', 'f') 

现在仅仅抽取 “数字..数字” 位和分裂:

# extract just "number..number", ignoring all else. 
tmp <- gsub('^.*?([0-9]+\\.\\.[0-9]+).*$', '\\1', as.character(mydf$X3)) 
# split. use fixed=T 
tmp <- strsplit(tmp, '..', fixed=T) 
# extract the splits, convert to numeric 
mydf$X2 <- as.numeric(vapply(tmp, '[[', i=1, 'template')) 
mydf$X3 <- as.numeric(vapply(tmp, '[[', i=2, 'template')) 
# columns not in order, but you know how to fix that. 
# X1 X3 X4 X2 
# 1 a 67 f 27 
# 2 b 63 f 37 
# 3 c 7 f 57 
# 4 d 20 f 89 
# 5 e 17 f 20 
# 6 f 66 r 86 
# 7 g 37 r 97