1

我的桌子有点挣扎。我正在尝试拆分一些变量(使用 R),但我在使用一个特定列时遇到了困难。

我的数据集是这样的:

test<-data.frame(
 Chrom_no=c(1,1,2,3),
 Region=c('12..13','22..23','100','34..36'),
 Ref=c('AT','CG','A','AAA'),
 Alt=c('TA','GA','T','CGG'),
 Prob=c(99,98.7,99,99.9))

我想将所有组合在一起的区域分开。到目前为止,我已经解决了所有列,但“区域”之一:

ref2 <- strsplit(as.character(test$Ref), '')
alt2<-strsplit(as.character(test$Alt), '')

test2<-data.frame(
 Chrom_no=rep(test$Chrom_no, vapply(ref2, FUN=length, FUN.VALUE=integer(1))),
 Region=rep(test$Region, vapply(ref2, FUN=length, FUN.VALUE=integer(1))),
 Ref=unlist(ref2),
 Alt=unlist(alt2),
 Prob=rep(test$Prob, vapply(ref2, FUN=length, FUN.VALUE=integer(1))))

我不知道如何解决修复该列:例如 '12..13': 12 应该放在 Ref=A 中,13 应该放在 Ref=T 中(分别是第一个和第二个字符)。事情变得复杂了,因为有些列有 3 个字符(对应的范围:22..24),有些列会有更多。

我该怎么解决?最近几天一直在寻找解决方案,但我仍然不知道如何解决。如果这已在其他地方解决,我深表歉意。PS:我知道为了在“区域”列上进行拆分,我需要使用:

'\\..'

作为分隔符。

4

1 回答 1

0

如果我正确理解您的最终目标,您可以考虑使用“data.table”包。有了它,你可以像下面这样设置你的问题:

library(data.table)
## Change your data.frame to a data.table
DT <- as.data.table(test)
## Convert the relevant columns to be characters instead of factors
DT[, c("Region", "Ref", "Alt") := lapply(.SD, as.character), 
   .SDcols = c("Region", "Ref", "Alt")]
DT[, list(Chrom_no = rep(Chrom_no, nchar(Ref)),          # Expand the Chrom_no
          Region = unlist(lapply(                        # Split Region and use
            strsplit(Region, "..", TRUE),                # the result to create
            function(x) {                                # the range of values
              x <- as.numeric(x)                         # needed
              if (length(x) > 1) seq(x[1], x[2]) else x
            })), 
          Ref = unlist(strsplit(Ref, "")),               # Split Ref
          Alt = unlist(strsplit(Alt, "")),               # Split Alt
          Prob = rep(Prob, nchar(Ref)))]                 # Expand Prob
#    Chrom_no Region Ref Alt Prob
# 1:        1     12   A   T 99.0
# 2:        1     13   T   A 99.0
# 3:        1     22   C   G 98.7
# 4:        1     23   G   A 98.7
# 5:        2    100   A   T 99.0
# 6:        3     34   A   C 99.9
# 7:        3     35   A   G 99.9
# 8:        3     36   A   G 99.9

上面的代码可能会简化一点,但我认为这应该足以让您入门。

于 2014-09-14T14:31:31.853 回答