【问题标题】:convert 2 columns dataframe to matrix by slicing rownames - R通过切片行名将 2 列数据帧转换为矩阵 - R
【发布时间】:2018-02-08 09:30:43
【问题描述】:

我在 R 中有两个数据框,我想将它们转换为矩阵。这是我的示例数据

一个 data.frame dat 有 2 列,一列包含名称,第二列包含一些分数。

> head(dat, n=20)
                                                     V1           V2
1                                      4star_Active_TSS  10.99561503
2                               4star_Bivalent_Enhancer   0.42425920
3                             4star_Bivalent_Poised_TSS   0.31163730
4                                       4star_Enhancers 139.64713405
5                             4star_Flanking_Active_TSS  23.11961717
6                       4star_Flanking_Bivalent_TSS_Enh   0.17654506
7                                 4star_Genic_enhancers  44.42394542
8                                 4star_Heterochromatin -34.61099049
9                                   4star_Quiescent_Low -28.54240987
10                             4star_Repressed_PolyComb  -0.42096698
11                           4star_Strong_transcription  12.70895605
12                        4star_Transcr_at_gene_5_and_3   0.00000000
13                        4star_Weak_Repressed_PolyComb   0.08902141
14                             4star_Weak_transcription  19.28859369
15                          4star_ZNF_genes_and_repeats  -1.58340662
16          A549_EtOH_0.02pct_Lung_Carcinoma_Active_TSS  14.01552989
17   A549_EtOH_0.02pct_Lung_Carcinoma_Bivalent_Enhancer   1.00466761
18 A549_EtOH_0.02pct_Lung_Carcinoma_Bivalent_Poised_TSS   1.20607773
19           A549_EtOH_0.02pct_Lung_Carcinoma_Enhancers  63.36004048
20 A549_EtOH_0.02pct_Lung_Carcinoma_Flanking_Active_TSS  48.27400816

其他数据框为一列,包含上述数据框row.names的半名。

> states=read.delim("states.txt", header=FALSE)
> states
                          V1
1                 Active_TSS
2          Bivalent_Enhancer
3        Bivalent_Poised_TSS
4                  Enhancers
5        Flanking_Active_TSS
6  Flanking_Bivalent_TSS_Enh
7            Genic_enhancers
8            Heterochromatin
9              Quiescent_Low
10        Repressed_PolyComb
11      Strong_transcription
12   Transcr_at_gene_5_and_3
13   Weak_Repressed_PolyComb
14        Weak_transcription
15     ZNF_genes_and_repeats

我希望得到的 matrix/data.frame 类似于以下内容。我想用第二个 data.frame 的列切掉第一个 data.frame 的第一列,并创建一个如下所示的矩阵。

>dd_matrix
                                 Active_TSS Bivalent_Enhancer
4star                              10.99562         0.4242592
A549_EtOH_0.02pct_Lung_Carcinoma   14.01553         1.0046676
                                 Bivalent_Poised_TSS Enhancers
4star                                      0.3116373 139.64713
A549_EtOH_0.02pct_Lung_Carcinoma           1.2060777  63.36004
                                 Flanking_Active_TSS Flanking_Bivalent_TSS_Enh
4star                                       23.11962                 0.1765451
A549_EtOH_0.02pct_Lung_Carcinoma            48.27401                 1.1449923
                                 Genic_enhancers Heterochromatin Quiescent_Low
4star                                  44.423945      -34.610990     -28.54241
A549_EtOH_0.02pct_Lung_Carcinoma        5.976754       -1.274768     -31.68228
                                 Repressed_PolyComb Strong_transcription
4star                                     -0.420967            12.708956
A549_EtOH_0.02pct_Lung_Carcinoma          -0.331186             3.375022
                                 Transcr_at_gene_5_and_3
4star                                           0.000000
A549_EtOH_0.02pct_Lung_Carcinoma                1.501412
                                 Weak_Repressed_PolyComb Weak_transcription
4star                                         0.08902141           19.28859
A549_EtOH_0.02pct_Lung_Carcinoma             -0.05151471           11.19855
                                 ZNF_genes_and_repeats
4star                                        -1.583407
A549_EtOH_0.02pct_Lung_Carcinoma              0.000000

任何帮助将不胜感激。任何Runix 解决方案也可以工作。

谢谢。

【问题讨论】:

    标签: r unix matrix


    【解决方案1】:

    这是使用dplyr/tidyr的解决方案:

    require(tidyverse);
    df %>%
        separate(V1, into = c("what","states"), "_", extra = "merge") %>%
        spread(states, V2) %>%
        column_to_rownames("what");
    #      Active_TSS Bivalent_Enhancer Bivalent_Poised_TSS Enhancers
    #4star   10.99562         0.4242592           0.3116373  139.6471
    #A549          NA                NA                  NA        NA
    #      EtOH_0.02pct_Lung_Carcinoma_Active_TSS
    #4star                                     NA
    #A549                                14.01553
    #      EtOH_0.02pct_Lung_Carcinoma_Bivalent_Enhancer
    #4star                                            NA
    #A549                                       1.004668
    #      EtOH_0.02pct_Lung_Carcinoma_Bivalent_Poised_TSS
    #4star                                              NA
    #A549                                         1.206078
    #      EtOH_0.02pct_Lung_Carcinoma_Enhancers
    #4star                                    NA
    #A549                               63.36004
    #      EtOH_0.02pct_Lung_Carcinoma_Flanking_Active_TSS Flanking_Active_TSS
    #4star                                              NA            23.11962
    #A549                                         48.27401                  NA
    #      Flanking_Bivalent_TSS_Enh Genic_enhancers Heterochromatin Quiescent_Low
    #4star                 0.1765451        44.42395       -34.61099     -28.54241
    #A549                         NA              NA              NA            NA
    #      Repressed_PolyComb Strong_transcription Transcr_at_gene_5_and_3
    #4star          -0.420967             12.70896                       0
    #A549                  NA                   NA                      NA
    #      Weak_Repressed_PolyComb Weak_transcription ZNF_genes_and_repeats
    #4star              0.08902141           19.28859             -1.583407
    #A549                       NA                 NA                    NA
    

    解释:将V1拆分为两列,将第一列"_"拆分;然后将spread 转换为宽格式,使用states 作为键,V2 作为值,并将列what 转换为行名。


    样本数据

    df <- read.table(text =
        "                                                    V1           V2
    1                                      4star_Active_TSS  10.99561503
    2                               4star_Bivalent_Enhancer   0.42425920
    3                             4star_Bivalent_Poised_TSS   0.31163730
    4                                       4star_Enhancers 139.64713405
    5                             4star_Flanking_Active_TSS  23.11961717
    6                       4star_Flanking_Bivalent_TSS_Enh   0.17654506
    7                                 4star_Genic_enhancers  44.42394542
    8                                 4star_Heterochromatin -34.61099049
    9                                   4star_Quiescent_Low -28.54240987
    10                             4star_Repressed_PolyComb  -0.42096698
    11                           4star_Strong_transcription  12.70895605
    12                        4star_Transcr_at_gene_5_and_3   0.00000000
    13                        4star_Weak_Repressed_PolyComb   0.08902141
    14                             4star_Weak_transcription  19.28859369
    15                          4star_ZNF_genes_and_repeats  -1.58340662
    16          A549_EtOH_0.02pct_Lung_Carcinoma_Active_TSS  14.01552989
    17   A549_EtOH_0.02pct_Lung_Carcinoma_Bivalent_Enhancer   1.00466761
    18 A549_EtOH_0.02pct_Lung_Carcinoma_Bivalent_Poised_TSS   1.20607773
    19           A549_EtOH_0.02pct_Lung_Carcinoma_Enhancers  63.36004048
    20 A549_EtOH_0.02pct_Lung_Carcinoma_Flanking_Active_TSS  48.27400816", header = T)
    

    【讨论】:

    • 嗨@Maurits,非常感谢。我稍微修改了输入df。有没有办法根据 _ 的最后一次出现来拆分 V1 ?我检查了separate 函数,但理解起来没有什么问题。
    • 更新:我写了一个shell脚本只保留一个_。现在它完美无缺。非常感谢。
    • @cat 澄清一下:在我的解决方案中,separate"_" 上拆分术语,将第一个术语存储在what 列中,并将剩余的 merged 术语存储在专栏states。如果what 始终通过first 下划线与states 分隔,则此解决方案将起作用。
    • @cat PS。您可以通过在解决方案旁边打勾来关闭问题并接受最能回答您问题的解决方案。
    • 我已经做了相应的修改。现在我根据我的需要得到输出。谢谢!
    【解决方案2】:

    棘手的事情似乎是状态和前缀之间没有分隔符,并且某些状态是其他状态的一部分。无论如何,这就是我想出的:

    library(tidyverse)
    dat  %>%
      rowwise() %>%
      mutate(postfix = max(states$V1[str_detect(V1, states$V1)])) %>%
      mutate(prefix = str_replace(V1, str_c("_", postfix), "")) %>%
      melt(id.vars = c("postfix", "prefix"), measure.vars = "V2") %>%
      dcast(prefix ~ postfix) 
    

    在第一个mutate中,最长的匹配状态被识别出来形成postfix。在第二个mutate 中,这个postfix 被删除以形成prefix

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多