use*_*775 4 r bioinformatics create-table reshape dataframe
我想从之前创建的数据框创建一个数据框.我的第一个数据框是:
Sample motif chromosome
1 CT-G.A 1
1 TA-C.C 1
1 TC-G.C 2
2 CG-A.T 2
2 CA-G.T 2
Run Code Online (Sandbox Code Playgroud)
然后我想创建一个如下所示的数据帧(96*24-motifs*chromosomes-):
Sample CT-G.A,chr1 TA-C.C,chr1 TC-G.C,chr1 CG-A.T,ch1 CA-G.T,ch1 CT-G.A,chr2 TA-C.C,chr2 TC-G.C,chr2 CG-A.T,ch2 CA-G.T,ch2
1 1 1 0 0 0 0 0 1 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 1 1
Run Code Online (Sandbox Code Playgroud)
这是一个使用dplyr
和的可能的解决方案tidyr
.
我们添加一个列value
,指示是否存在染色体,然后完成data.frame
,确保每个motif-chromosome-Sample
组合都有行,其中缺少的组合0
在值列中得到a .我们创建了一个key
主题和染色体列,然后丢弃这些列.最后,我们重新设计data.frame
从长到宽(见这里)以获得您想要的格式.希望这可以帮助!
df = read.table(text="Sample motif chromosome
1 CT-G.A 1
1 TA-C.C 1
1 TC-G.C 2
2 CG-A.T 2
2 CA-G.T 2
2 CA-G.T 2",header=T)
library(tidyr)
library(dplyr)
df %>% mutate(value=1) %>% complete(motif,chromosome,Sample,fill=list(value=0)) %>%
mutate(key=paste0(motif,',chr',chromosome)) %>%
group_by(Sample,key) %>%
summarize(value = sum(value)) %>%
spread(key,value) %>%
as.data.frame
Run Code Online (Sandbox Code Playgroud)
输出:
Sample CA-G.T,chr1 CA-G.T,chr2 CG-A.T,chr1 CG-A.T,chr2 CT-G.A,chr1 CT-G.A,chr2 TA-C.C,chr1 TA-C.C,chr2 TC-G.C,chr1 TC-G.C,chr2
1 1 0 0 0 0 1 0 1 0 0 1
2 2 0 2 0 1 0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)