R - 使用 reshape2 或 dplyr 在同一单元格中重塑具有多个元素的数据框
R - reshape dataframe with multiple elements in the same cell using reshape2 or dplyr
我需要根据 'UCSC_RefGene_Name' 和 'UCSC_RefGene_Group' 列上的值重组一个巨大的数据框,同时维护 'ID' 列中的每个值。使用 reshape2 或 dplyr 包可以实现这一点吗?
df <- data.frame(ID=c('cg00035864','cg00050873', 'cg00061679', 'cg00063477', 'cg00121626', 'cg00212031'),
UCSC_RefGene_Name=c('TTTY18', 'TSPY4;FAM197Y2', 'DAZ1;DAZ4;DAZ5', 'EIF1AY', 'BCORL2', 'TTTY14'),
UCSC_RefGene_Group = c('TSS1500','Body;TSS1500','Body;Body;Body', 'Body', 'Body', 'TSS200'))
> df
ID UCSC_RefGene_Name UCSC_RefGene_Group
cg00035864 TTTY18 TSS1500
cg00050873 TSPY4;FAM197Y2 Body;TSS1500
cg00061679 DAZ1;DAZ4;DAZ4 Body;Body;Body
cg00063477 EIF1AY Body
cg00121626 BCORL2 Body
cg00212031 TTTY14 TSS200
有些单元格包含多个由“;”分隔的元素符号,所以我需要创建新行来容纳这些元素。我的新 DF 将是:
new_df <- data.frame(ID=c('cg00035864','cg00050873', 'cg00050873','cg00061679', 'cg00061679','cg00061679','cg00063477', 'cg00121626', 'cg00212031'),
UCSC_RefGene_Name=c('TTTY18', 'TSPY4','FAM197Y2', 'DAZ1','DAZ4','DAZ5', 'EIF1AY', 'BCORL2', 'TTTY14'),
UCSC_RefGene_Group = c('TSS1500','Body','TSS1500','Body','Body','Body', 'Body', 'Body', 'TSS200'))
> new_df
ID UCSC_RefGene_Name UCSC_RefGene_Group
cg00035864 TTTY18 TSS1500
cg00050873 TSPY4 Body
cg00050873 FAM197Y2 TSS1500
cg00061679 DAZ1 Body
cg00061679 DAZ4 Body
cg00061679 DAZ5 Body
cg00063477 EIF1AY Body
cg00121626 BCORL2 Body
cg00212031 TTTY14 TSS200
我们可以在两列上应用separate_rows
library(dplyr)
library(tidyr)
df %>%
separate_rows(UCSC_RefGene_Name, UCSC_RefGene_Group)
# ID UCSC_RefGene_Name UCSC_RefGene_Group
#1 cg00035864 TTTY18 TSS1500
#2 cg00050873 TSPY4 Body
#3 cg00050873 FAM197Y2 TSS1500
#4 cg00061679 DAZ1 Body
#5 cg00061679 DAZ4 Body
#6 cg00061679 DAZ5 Body
#7 cg00063477 EIF1AY Body
#8 cg00121626 BCORL2 Body
#9 cg00212031 TTTY14 TSS200
我需要根据 'UCSC_RefGene_Name' 和 'UCSC_RefGene_Group' 列上的值重组一个巨大的数据框,同时维护 'ID' 列中的每个值。使用 reshape2 或 dplyr 包可以实现这一点吗?
df <- data.frame(ID=c('cg00035864','cg00050873', 'cg00061679', 'cg00063477', 'cg00121626', 'cg00212031'),
UCSC_RefGene_Name=c('TTTY18', 'TSPY4;FAM197Y2', 'DAZ1;DAZ4;DAZ5', 'EIF1AY', 'BCORL2', 'TTTY14'),
UCSC_RefGene_Group = c('TSS1500','Body;TSS1500','Body;Body;Body', 'Body', 'Body', 'TSS200'))
> df
ID UCSC_RefGene_Name UCSC_RefGene_Group
cg00035864 TTTY18 TSS1500
cg00050873 TSPY4;FAM197Y2 Body;TSS1500
cg00061679 DAZ1;DAZ4;DAZ4 Body;Body;Body
cg00063477 EIF1AY Body
cg00121626 BCORL2 Body
cg00212031 TTTY14 TSS200
有些单元格包含多个由“;”分隔的元素符号,所以我需要创建新行来容纳这些元素。我的新 DF 将是:
new_df <- data.frame(ID=c('cg00035864','cg00050873', 'cg00050873','cg00061679', 'cg00061679','cg00061679','cg00063477', 'cg00121626', 'cg00212031'),
UCSC_RefGene_Name=c('TTTY18', 'TSPY4','FAM197Y2', 'DAZ1','DAZ4','DAZ5', 'EIF1AY', 'BCORL2', 'TTTY14'),
UCSC_RefGene_Group = c('TSS1500','Body','TSS1500','Body','Body','Body', 'Body', 'Body', 'TSS200'))
> new_df
ID UCSC_RefGene_Name UCSC_RefGene_Group
cg00035864 TTTY18 TSS1500
cg00050873 TSPY4 Body
cg00050873 FAM197Y2 TSS1500
cg00061679 DAZ1 Body
cg00061679 DAZ4 Body
cg00061679 DAZ5 Body
cg00063477 EIF1AY Body
cg00121626 BCORL2 Body
cg00212031 TTTY14 TSS200
我们可以在两列上应用separate_rows
library(dplyr)
library(tidyr)
df %>%
separate_rows(UCSC_RefGene_Name, UCSC_RefGene_Group)
# ID UCSC_RefGene_Name UCSC_RefGene_Group
#1 cg00035864 TTTY18 TSS1500
#2 cg00050873 TSPY4 Body
#3 cg00050873 FAM197Y2 TSS1500
#4 cg00061679 DAZ1 Body
#5 cg00061679 DAZ4 Body
#6 cg00061679 DAZ5 Body
#7 cg00063477 EIF1AY Body
#8 cg00121626 BCORL2 Body
#9 cg00212031 TTTY14 TSS200