R将一列拆分为两列,当分隔符是' ..'

时间:2015-07-21 00:46:43

标签: regex 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", "\\.\\.")

有什么建议吗?

提前致谢

2 个答案:

答案 0 :(得分:1)

这是基础R解决方案。 使用fixed=T中的strsplit分割文字点而不是点作为通配符。您可以使用(例如)grepl来检测"补充"。

e.g。

# 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')

现在只提取&#34; number..number&#34;位和分裂:

# 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

答案 1 :(得分: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="\\.\\.")