如何格式化data.frame?

如何格式化data.frame?,r,bioinformatics,R,Bioinformatics,如何根据GeneID重新格式化data.frame df1。必须根据通用GeneID对表进行分组。我还想申请这个职位 df1= GeneID Common Organism Name Position 3 mouse 10090 Acadm Chr5:26082574-26089291(-) 3 human 9606 ACADM Chr5:15028950-15032998(-) 6 mouse

如何根据GeneID重新格式化data.frame df1。必须根据通用GeneID对表进行分组。我还想申请这个职位

df1=

GeneID  Common Organism Name        Position    
    3   mouse   10090   Acadm   Chr5:26082574-26089291(-)   
    3   human   9606    ACADM   Chr5:15028950-15032998(-)   
    6   mouse   10090   Acat1   Chr5:25999022-26004798(-)   
    6   human   9606    ACAT1   Chr5:15471699-15477027(-)   
    7   human   9606    NLN Chr5:26257691-26264308(+)   
    8   mouse   10090   canct1  Chr5:14910122-14914899(-)   
    9   mouse   9606    Gm10220 Chr5:25936465-25943267(-)   
    9   mouse   9606    Gm10354 Chr5:25949797-25954344(-)   
    9   mouse   9606    Gm1979  Chr5:11594913-11599784(+)   
    9   human   10090   TRIL    Chr7:28953358-28958413(-)   
预期产量

Gene.ID M.Gene  M.Chr M.start   M.end      H.Gene H.Chr H.start     H.end
    3   Acadm   5   26082574    26089291    ACADM   5   15028950    15032998
    6   Acat1   5   25999022    26004798    ACAT1   5   15471699    15477027
    7   NA      NA  NA          NA           NLN    5   26257691    26264308
    8   canct1  5   14910122    14914899     NA       NA    NA      NA
    9   Gm10220 5   25936465    25943267    TRIL    7   28953358    28958413
    9   Gm10354 5   25949797    25954344    TRIL    7   28953358    28958413
    9   Gm1979  5   1159491     11599784    TRIL    7   28953358    28958413
    9   Gm21149 5   11594913    11599784    TRIL    7   28953358    28958413

我们可以使用“data.table”的
devel
版本,即
v1.9.5
。安装说明如下所示

我们将“data.frame”更改为“data.table”(
setDT(df1)
)。使用
tstrsplit
,我们将“位置”拆分为所有非数字字符(
[^0-9]+
),以创建新列(“Chr”、“start”、“end”)

devel版本中的
dcast
可以采用多个
value.var
列,并将“长”格式更改为“宽”格式。我们可以用数据集中的非NA值替换NA值

dcast(DT, GeneID+ind~substr(Common, 1, 1), value.var=names(DT)[c(4,6:8)])[,
 lapply(.SD, function(x) x[!is.na(x)]) , GeneID, .SDcols=h_Name:m_end]
#    GeneID h_Name  m_Name h_Chr m_Chr  h_start  m_start    h_end    m_end
#1:      3  ACADM   Acadm     5     5 15028950 26082574 15032998 26089291
#2:      6  ACAT1   Acat1     5     5 15471699 25999022 15477027 26004798
#3:      7    NLN      NA     5    NA 26257691       NA 26264308       NA
#4:      8     NA  canct1    NA     5       NA 14910122       NA 14914899
#5:      9   TRIL Gm10220     7     5 28953358 25936465 28958413 25943267
#6:      9   TRIL Gm10354     7     5 28953358 25949797 28958413 25954344
#7:      9   TRIL  Gm1979     7     5 28953358 11594913 28958413 11599784

另一个选项使用
lappy

# using split method from akrun's answer
library(data.table)#v1.9.5+
DT <- setDT(df1)[, c('Chr', 'start', 'end') :=tstrsplit(Position, '[^0-9]+')[-1]]

out = setDF(Reduce(function(...) merge(..., by="GeneID", all = T),
            lapply(split(DT, DT$Common), 
            function(x) subset(x, select = -c(Common, Position, Organism)))))  

colnames(out) = gsub("x", "H", colnames(out)) 
colnames(out) = gsub("y", "M", colnames(out))

#> out
#  GeneID Name.H Chr.H  start.H    end.H  Name.M Chr.M  start.M    end.M
#1      3  ACADM     5 15028950 15032998   Acadm     5 26082574 26089291
#2      6  ACAT1     5 15471699 15477027   Acat1     5 25999022 26004798
#3      7    NLN     5 26257691 26264308    <NA>  <NA>     <NA>     <NA>
#4      8   <NA>  <NA>     <NA>     <NA>  canct1     5 14910122 14914899
#5      9   TRIL     7 28953358 28958413 Gm10220     5 25936465 25943267
#6      9   TRIL     7 28953358 28958413 Gm10354     5 25949797 25954344
#7      9   TRIL     7 28953358 28958413  Gm1979     5 11594913 11599784
#使用akrun答案中的拆分方法
库(数据表)#v1.9.5+
DT输出
#GeneID Name.H Chr.H start.H end.H Name.M Chr.M start.M end.M
#1 3 ACADM 5 15028950 15032998 ACADM 5 26082574 26089291
#2 6 ACAT1 5 15471699 15477027 ACAT1 5 25999022 26004798
#3 7荷兰国家图书馆5 26257691 26264308
#4 8 canct1 5 14910122 14914899
#5 9特里尔7 28953358 28958413 Gm10220 5 25936465 25943267
#6 9 TRIL 7 28953358 28958413 Gm10354 5 25949797 25954344
#7 9特里尔7 28953358 28958413 Gm1979 5 11594913 11599784

M.start
M.end
Position
列的拆分版本,但是
H.start
H.end
呢。从哪里开始?我猜您在预期输出中的最后一行在输入中没有显示ndataset@SabDeM.. 新表是根据唯一的Gene.ID和Common.@akrun排列的。这个命令对我来说有点复杂。你能描述一下吗it@akrun喜欢在回答中使用
tstrsplit
,并升级到
devel
版本!(+1)@初学者,正如我在代码中解释的,第一组代码,使用
tstrsplit
从单个列创建3列,在第二个代码块中,为分组变量创建序列列(ind),在第三个代码块中,我们使用
dcast
将“长”格式转换为“宽”格式。在我们更改了“宽”格式后,一些列具有
NA
值,因为它们没有对应于组的行组合。因此,我们将该列中的NA值更改为非NA值(
lapply(.SD,function(x)x[!is.NA(x)])
如果您提到有困难的地方,我可以检查一下。@akrun.Thank you.tstrsplit函数对我来说是新的,非常有用。我不理解如何为人和鼠标分配colname(Chr_h,Chr_m,start_h,start_m..等等)@初学者这里的
trsplit
输出是4列,其中第一列是空列,我通过
tstrsplit(位置,[^0-9]+')[-1]
删除了它。新列是用列名
c('Chr','start','end')
创建的。当我们执行
dcast
~substr(Common,1,1)
,使用
substr
提取“Common”的第一个字符,并在此处给出
\u m
\u h
dcast(DT, GeneID+ind~substr(Common, 1, 1), value.var=names(DT)[c(4,6:8)])[,
 lapply(.SD, function(x) x[!is.na(x)]) , GeneID, .SDcols=h_Name:m_end]
#    GeneID h_Name  m_Name h_Chr m_Chr  h_start  m_start    h_end    m_end
#1:      3  ACADM   Acadm     5     5 15028950 26082574 15032998 26089291
#2:      6  ACAT1   Acat1     5     5 15471699 25999022 15477027 26004798
#3:      7    NLN      NA     5    NA 26257691       NA 26264308       NA
#4:      8     NA  canct1    NA     5       NA 14910122       NA 14914899
#5:      9   TRIL Gm10220     7     5 28953358 25936465 28958413 25943267
#6:      9   TRIL Gm10354     7     5 28953358 25949797 28958413 25954344
#7:      9   TRIL  Gm1979     7     5 28953358 11594913 28958413 11599784
# using split method from akrun's answer
library(data.table)#v1.9.5+
DT <- setDT(df1)[, c('Chr', 'start', 'end') :=tstrsplit(Position, '[^0-9]+')[-1]]

out = setDF(Reduce(function(...) merge(..., by="GeneID", all = T),
            lapply(split(DT, DT$Common), 
            function(x) subset(x, select = -c(Common, Position, Organism)))))  

colnames(out) = gsub("x", "H", colnames(out)) 
colnames(out) = gsub("y", "M", colnames(out))

#> out
#  GeneID Name.H Chr.H  start.H    end.H  Name.M Chr.M  start.M    end.M
#1      3  ACADM     5 15028950 15032998   Acadm     5 26082574 26089291
#2      6  ACAT1     5 15471699 15477027   Acat1     5 25999022 26004798
#3      7    NLN     5 26257691 26264308    <NA>  <NA>     <NA>     <NA>
#4      8   <NA>  <NA>     <NA>     <NA>  canct1     5 14910122 14914899
#5      9   TRIL     7 28953358 28958413 Gm10220     5 25936465 25943267
#6      9   TRIL     7 28953358 28958413 Gm10354     5 25949797 25954344
#7      9   TRIL     7 28953358 28958413  Gm1979     5 11594913 11599784