涉及strsplit的R数据处理

涉及strsplit的R数据处理,r,dataframe,strsplit,R,Dataframe,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

我有一个数据框,看起来像这样:

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

  • 附加值为strsplit(df$V1,“:”[[1]]的列chr(拆分 上的第一列值:并将第一个索引分配给此新索引 (列)
  • 附加列start的值为strsplit(df$V1,“:”[[2]]=> strsplit(df$V1,“-”[[1]](首先拆分第一列值:take) 第二个索引,然后将其拆分-并将第一个索引分配给此新索引 (列)
  • 附加列end的值为df$start+length(df$V6)(外接程序 start的值,V6列中字符的长度)
  • 附加值为strsplit(df$V2,“.”[[1]]的列TF(拆分 上的第二列值,并将第一个索引分配给此新索引 纵队
  • 因此,附加的新列如下所示:

    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
    分为
    chr
    start
    end
    列,然后在
    TF
    列中附加
    V2
    中第一个点之前的所有内容。
    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
    
    > 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
    
    2)无软件包仅使用基本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))
    
    注:
    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)
    
    1)tidyr/dplyr这将列
    V1
    分为
    chr
    start
    end
    列,然后在
    TF
    列中附加
    V2
    中第一个点之前的所有内容。
    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
    
    > 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
    
    2)无软件包仅使用基本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))
    
    注:
    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)
    

    Lines您可以编写一个函数
    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)
    

    您可以编写一个函数
    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)
    

    @g-grothendieck非常感谢您提供的多种解决方案。这个解决方案只有一个问题,那就是
    end
    列<代码>结束
    列应包含值,该值为df$V6中的
    开始+字符长度
    。例如,对于第一行,它将是
    859582+9=859591
    而不是'899582'?这就是我现在得到的。你能指导我怎么做吗?再次谢谢你。已经添加了。@g-Grothedick您能帮我用foreach循环或parSapply替换for循环吗。谢谢。@g-grothendieck非常感谢您提供的多种解决方案。这个解决方案只有一个问题,那就是
    end
    列<代码>结束
    列应包含值,该值为df$V6中的
    开始+字符长度
    。例如,对于第一行,它将是
    859582+9=859591
    而不是'899582'?这就是我现在得到的。你能指导我怎么做吗?再次谢谢你。已经添加了。@g-Grothedick您能帮我用foreach循环或parSapply替换for循环吗。谢谢。@rui barrada非常感谢您的解决方案。这个解决方案只有一个问题,那就是
    end
    列<代码>结束列应包含值,该值为df$V6中的
    开始+字符长度
    。例如,对于第一行,它将是
    859582+9=859591
    而不是'899582'?这就是我现在得到的。你能指导我怎么做吗?再次感谢。
    end@Newbie刚刚修改过。看看是否是这样。对于结束列,您必须选择第一个索引(即开始列),然后在其中添加nchar。它将是:
    end@rui barradad非常感谢您的解决方案。这个解决方案只有一个问题,那就是
    end
    列<代码>结束
    列应包含值,该值为df$V6中的
    开始+字符长度
    。例如,对于第一行,它将是
    859582+9=859591
    而不是'899582'?这就是我现在得到的。你能指导我怎么做吗?再次感谢。
    end@Newbie刚刚修改过。看看是否是这样。对于结束列,您必须选择第一个索引(即开始列),然后在其中添加nchar。它将是:
    end