我有一个如下所示的数据框:
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)
我正在努力使用..
作为分隔符将此数据框分成三列。我已尝试过类似帖子的其他解决方案,例如splitstackshape
和gsub
,但是没有一个真正起作用,因为这些是分隔符不是像时段这样的通配符值。
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", "\\.\\.")
有什么建议吗?
提前致谢
答案 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)
使用dplyr
和tidyr
:
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="\\.\\.")