涉及strsplit的R数据处理

R data processing involving strsplit

我有一个如下所示的数据框:

> df
                   V1         V2    V3 V4       V5                 V6 V7
1  chr1:859582-899582    AHR.pfm 33440  - 9.188581          gcacgcaac NA
2  chr2:859582-899582   AIRE.pfm  7387  + 7.982141 TCTGGTTCAGTTGGATGC NA
3  chr1:859582-899582 AIRE.3.pfm 30639  - 8.127811 aaaaccaaacaaacaaaa NA
4 chr13:859582-899582   ALX1.pfm 11835  + 7.485710       GTAATTGTGTTA NA
5 chr21:859582-899582 ALX1.1.pfm 16260  + 9.529333       GTAATTAATTTA NA
6  chrX:859582-899582 ALX1.2.pfm 20686  + 9.241755       CTAATTAATTTA NA

我想将多个新列附加到此数据框,所有这些列都将包含来自此数据框的信息。详情如下:

  1. 附加列 chr 具有值 strsplit(df$V1,":")[[1]](拆分 第一列值:并将第一个索引分配给这个新的 列)
  2. 附加列 start 具有值 strsplit(df$V1,":")[[2]] => strsplit(df$V1,"-")[[1]] (首先拆分第一列值:取 第二个索引然后将其拆分 - 并将第一个索引分配给这个新的 列)
  3. 追加列 end 具有值 df$start + length(df$V6)(添加 start的值,V6列的字符长度)
  4. 附加列 TF 具有值 strsplit(df$V2,".")[[1]](拆分 上的第二列值。并将第一个索引分配给这个新的 列

因此附加的新列如下所示:

chr1 859582 859591  AHR
chr2 859582 859600  AIRE
chr1 859582 859600  AIRE
chr13 859582 859594 ALX1
chr21 859582 859594 ALX1
chrX 859582 859594  ALX1

1) tidyr/dplyr 这会将列 V1 分成 chrstartend 列,并且然后在 V2 中的第一个点之前附加一个 TF 列,其中包含所有内容。 mutate 的替代方案可能是 separate(V2, "TF", extra = "drop"),它将删除 V2 并将 TF 放在它的位置。如果您还想保留原始列,请添加 separate 参数 remove=FALSE

library(dplyr)
library(tidyr)

library(dplyr)
library(tidyr)
df %>% 
   separate(V1, c("chr", "start", "end"), convert = TRUE) %>%
   mutate(TF = sub("[.].*", "", V2), end = end + nchar(V6))

给予:

    chr  start    end         V2    V3 V4       V5                 V6 V7   TF
1  chr1 859582 899591    AHR.pfm 33440  - 9.188581          gcacgcaac NA  AHR
2  chr2 859582 899600   AIRE.pfm  7387  + 7.982141 TCTGGTTCAGTTGGATGC NA AIRE
3  chr1 859582 899600 AIRE.3.pfm 30639  - 8.127811 aaaaccaaacaaacaaaa NA AIRE
4 chr13 859582 899594   ALX1.pfm 11835  + 7.485710       GTAATTGTGTTA NA ALX1
5 chr21 859582 899594 ALX1.1.pfm 16260  + 9.529333       GTAATTAATTTA NA ALX1
6  chrX 859582 899594 ALX1.2.pfm 20686  + 9.241755       CTAATTAATTTA NA ALX1

2) 没有包 一种只使用 base R 的方法是:

nms <- c("chr", "start", "end")
df2 <- cbind(df[-1], 
 read.table(text = sub("-", ":", df$V1), sep = ":", as.is = TRUE, col.names = nms), 
 TF = sub("[.].*", "", df$V2), 
 stringsAsFactors = FALSE)
 df2 <- transform(df2, end = end + nchar(V6))

给予:

> df2
          V2    V3 V4       V5                 V6 V7   chr  start    end   TF
1    AHR.pfm 33440  - 9.188581          gcacgcaac NA  chr1 859582 899591  AHR
2   AIRE.pfm  7387  + 7.982141 TCTGGTTCAGTTGGATGC NA  chr2 859582 899600 AIRE
3 AIRE.3.pfm 30639  - 8.127811 aaaaccaaacaaacaaaa NA  chr1 859582 899600 AIRE
4   ALX1.pfm 11835  + 7.485710       GTAATTGTGTTA NA chr13 859582 899594 ALX1
5 ALX1.1.pfm 16260  + 9.529333       GTAATTAATTTA NA chr21 859582 899594 ALX1
6 ALX1.2.pfm 20686  + 9.241755       CTAATTAATTTA NA  chrX 859582 899594 ALX1

注: df 可重现形式:

Lines <- "
                   V1         V2    V3 V4       V5                 V6 V7
1  chr1:859582-899582    AHR.pfm 33440  - 9.188581          gcacgcaac NA
2  chr2:859582-899582   AIRE.pfm  7387  + 7.982141 TCTGGTTCAGTTGGATGC NA
3  chr1:859582-899582 AIRE.3.pfm 30639  - 8.127811 aaaaccaaacaaacaaaa NA
4 chr13:859582-899582   ALX1.pfm 11835  + 7.485710       GTAATTGTGTTA NA
5 chr21:859582-899582 ALX1.1.pfm 16260  + 9.529333       GTAATTAATTTA NA
6  chrX:859582-899582 ALX1.2.pfm 20686  + 9.241755       CTAATTAATTTA NA"
df <- read.table(text = Lines, as.is = TRUE)

您可以编写一个函数 fun 来执行此操作,并重复调用 sapply/strsplit

fun <- function(DF){
    chr <- sapply(strsplit(DF[[1]], ":"), `[`, 1)
    start <- sapply(strsplit(DF[[1]], ":"), `[`, 2)
    end <- as.integer(sapply(strsplit(start, "-"), `[`, 1)) + nchar(DF[[6]])
    start <- sapply(strsplit(start, "-"), `[`, 1)
    TF <- sapply(strsplit(DF[[2]], "\."), `[`, 1)
    cbind(DF, data.frame(chr, start, end, TF))
}

fun(df)

请注意,必须使用 class characterV1V2 列读取数据,而不是 factor。如果它们属于 class factor,则首先将它们强制为 character,或者如果适用,设置参数 stringsAsFactors = FALSE

数据。

df <-
structure(list(V1 = c("chr1:859582-899582", "chr2:859582-899582", 
"chr1:859582-899582", "chr13:859582-899582", "chr21:859582-899582", 
"chrX:859582-899582"), V2 = c("AHR.pfm", "AIRE.pfm", "AIRE.3.pfm", 
"ALX1.pfm", "ALX1.1.pfm", "ALX1.2.pfm"), V3 = c(33440L, 7387L, 
30639L, 11835L, 16260L, 20686L), V4 = c("-", "+", "-", "+", "+", 
"+"), V5 = c(9.188581, 7.982141, 8.127811, 7.48571, 9.529333, 
9.241755), V6 = c("gcacgcaac", "TCTGGTTCAGTTGGATGC", "aaaaccaaacaaacaaaa", 
"GTAATTGTGTTA", "GTAATTAATTTA", "CTAATTAATTTA"), V7 = c(NA, NA, 
NA, NA, NA, NA)), .Names = c("V1", "V2", "V3", "V4", "V5", "V6", 
"V7"), class = "data.frame", row.names = c("1", "2", "3", "4", 
"5", "6"))