从数据框创建数据框

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)

Flo*_*ian 6

这是一个使用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)