首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中具有多个分隔符的拆分数据格式

R中具有多个分隔符的拆分数据格式
EN

Stack Overflow用户
提问于 2015-09-22 13:37:04
回答 2查看 3.7K关注 0票数 4
代码语言:javascript
复制
df1 <- 
     Gene             GeneLocus 
    CPA1|1357       chr7:130020290-130027948:+     
    GUCY2D|3000     chr17:7905988-7923658:+   
    UBC|7316        chr12:125396194-125399577:-            
    C11orf95|65998  chr11:63527365-63536113:-        
    ANKMY2|57037    chr7:16639413-16685398:- 

预期产出

代码语言:javascript
复制
df2 <- 
     Gene.1   Gene.2             chr     start     end 
    CPA1      1357               7     130020290 130027948   
    GUCY2D    3000               17      7905988   7923658  
    UBC       7316               12    125396194 125399577          
    C11orf95  65998              11     63527365  63536113     
    ANKMY2    57037               7     16639413  16685398]]

我试过这样..。

代码语言:javascript
复制
install.packages("splitstackshape")
library(splitstackshape)
df1 <- cSplit(df1,"Gene", sep="|", direction="wide", fixed=T)
df1 <- cSplit(df1,"GeneLocus",sep=":",direction="wide", fixed=T)
df1 <- cSplit(df1,"GeneLocus_2",sep="-",direction="wide", fixed=T)
df1 <- data.frame(df1)
df2$GeneLocus_1 <- gsub("chr","", df1$GeneLocus_1)

我想知道是否还有其他更简单的方法

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-22 13:49:51

在这里,go...Just忽略了不影响输出的警告;它实际上具有删除串信息(:+:-)的副作用。

代码语言:javascript
复制
library(tidyr)
library(dplyr)
df1 %>% separate(Gene, c("Gene.1","Gene.2")) %>% separate(GeneLocus, c("chr","start","end")) %>% mutate(chr=sub("chr","",chr))

输出:

代码语言:javascript
复制
    Gene.1 Gene.2 chr     start       end
1     CPA1   1357   7 130020290 130027948
2   GUCY2D   3000  17   7905988   7923658
3      UBC   7316  12 125396194 125399577
4 C11orf95  65998  11  63527365  63536113
5   ANKMY2  57037   7  16639413  16685398
票数 2
EN

Stack Overflow用户

发布于 2016-03-18 16:24:53

我建议采取以下方法:

  1. 在您的"GeneLocus“列中创建一个分隔符(并删除不必要的部分)。
  2. 同时分割两列。注意,根据检测到的输出列数,cSplit“平衡”了正在拆分的列。因此,由于第一列在拆分时只生成2列,而第二列将导致4,因此需要从结果中删除列3和4。
代码语言:javascript
复制
library(splitstackshape)

GLPat <- "^chr(\\d+):(\\d+)-(\\d+):([+-])$"
cSplit(as.data.table(mydf)[, GeneLocus := gsub(
  GLPat, "\\1|\\2|\\3|\\4", GeneLocus)], names(mydf), "|")[
    , 3:4 := NULL, with = FALSE][]
#      Gene_1 Gene_2 GeneLocus_1 GeneLocus_2 GeneLocus_3 GeneLocus_4
# 1:     CPA1   1357           7   130020290   130027948           +
# 2:   GUCY2D   3000          17     7905988     7923658           +
# 3:      UBC   7316          12   125396194   125399577           -
# 4: C11orf95  65998          11    63527365    63536113           -
# 5:   ANKMY2  57037           7    16639413    16685398           -

或者,您可以从我的"SOfun“包中尝试使用SOfun,您可以这样做:

代码语言:javascript
复制
library(SOfun)

Pat <- "^chr(\\d+):(\\d+)-(\\d+):([+-])$"
Fun <- function(invec) strsplit(gsub(Pat, "\\1|\\2|\\3|\\4", invec), "|", TRUE)

col_flatten(as.data.table(mydf)[, lapply(.SD, Fun)], names(mydf), drop = TRUE)
#      Gene_1 Gene_2 GeneLocus_1 GeneLocus_2 GeneLocus_3 GeneLocus_4
# 1:     CPA1   1357           7   130020290   130027948           +
# 2:   GUCY2D   3000          17     7905988     7923658           +
# 3:      UBC   7316          12   125396194   125399577           -
# 4: C11orf95  65998          11    63527365    63536113           -
# 5:   ANKMY2  57037           7    16639413    16685398           -

SOfun只在GitHub上,所以您可以用以下方式安装它:

代码语言:javascript
复制
source("http://news.mrdwab.com/install_github.R")
install_github("mrdwab/SOfun")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32718419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档