按外观在数据集中对交叉表的列和行进行排序

时间:2019-03-26 22:50:36

标签: r database crosstab

下面,我有以下由变量mutation排序的数据。我正在使用xtabs根据ID的值将因子变量subregion(列)与因子变量attribute(行)交叉制表。要按照它们在数据集中出现的顺序重新排序,我使用forcats::fct_reorder。基于(截断的)输出,这可以与下面给出的非常小的数据集一起使用。但是,我的数据有966个唯一的ID和〜58000个唯一的subregions。当我运行如下类似的代码时,它不会按正确的顺序给出列和行。

出现在数据集中较早的个体可能会在以后重复出现,因为它们在较晚的位置发生突变,但是子区域不会在数据集中的较后出现,因为它们是由其位置决定的。另外,对于重复的IDsubregion(请参阅ID的4,5和21,22),将导致其{{ 1}}值。无论如何,有没有要修改attribute才能保留所需的顺序?我也愿意接受其他交叉制表方法。

代码

xtabs

截断的输出

library(forcats)

#Cross-tabulate ID by subregion using attribute
df_tab <- as.data.frame.matrix(xtabs(df$attribute~fct_reorder(as.character(df$ID),df$mutation)+
                                   fct_reorder(as.character(df$subregion),df$mutation)))

数据集

             OR4F5:E1:E1 SAMD11:E2:E2 NOC2L:E5:E5 NOC2L:E4:E4 KLHL17:E3:E3
TCGA-AN-A046      1.0085     0.000000    0.000000    0.000000      0.00000
TCGA-A2-A0CP      0.0000     1.003465    0.000000    0.000000      0.00000
TCGA-A8-A08H      0.0000     0.000000    1.436694    0.000000      0.00000
TCGA-GM-A2DM      0.0000     0.000000    0.000000    2.335915      0.00000
TCGA-D8-A1XM      0.0000     0.000000    0.000000    0.000000      2.17849

1 个答案:

答案 0 :(得分:1)

这样的事情怎么办?

library(dplyr)
library(tidyr)
df.wide <- df %>%
    mutate(
        ID = factor(ID, levels = unique(.$ID[order(.$mutation)])),
        subregion = factor(subregion, levels = unique(.$subregion[order(.$mutation)]))) %>%
    group_by(ID, subregion) %>%
    mutate(n = 1:n()) %>%
    select(-mutation) %>%
    spread(subregion, attribute) %>%
    ungroup()
df.wide
## A tibble: 32 x 31
#   ID        n `OR4F5:E1:E1` `SAMD11:E2:E2` `NOC2L:E5:E5` `NOC2L:E4:E4`
#   <fct> <int>         <dbl>          <dbl>         <dbl>         <dbl>
# 1 TCGA…     1          1.01          NA            NA            NA
# 2 TCGA…     1         NA              1.00         NA            NA
# 3 TCGA…     1         NA             NA             1.44         NA
# 4 TCGA…     1         NA             NA            NA             1.17
# 5 TCGA…     2         NA             NA            NA             1.17
# 6 TCGA…     1         NA             NA            NA            NA
# 7 TCGA…     1         NA             NA            NA            NA
# 8 TCGA…     1         NA             NA            NA            NA
# 9 TCGA…     1         NA             NA            NA            NA
#10 TCGA…     1         NA             NA            NA            NA
## … with 22 more rows, and 25 more variables: `KLHL17:E3:E3` <dbl>,
##   `KLHL17:E5:E5` <dbl>, `KLHL17:E8:E8` <dbl>, `KLHL17:E9:E9` <dbl>,
##   `PLEKHN1:E1:E1` <dbl>, `PLEKHN1:E5:E5` <dbl>, `PLEKHN1:E12:E12` <dbl>,
##   `HES4:E3:E3` <dbl>, `ISG15:E2:E2` <dbl>, `AGRN:E2:E2` <dbl>,
##   `AGRN:E3:E3` <dbl>, `AGRN:E4:E4` <dbl>, `AGRN:E8:E8` <dbl>,
##   `AGRN:E25:E25` <dbl>, `AGRN:E29:E29` <dbl>, `AGRN:E36:E36` <dbl>,
##   `TTLL10:E13:E13` <dbl>, `SDF4:E4:E4` <dbl>, `SDF4:E2:E2` <dbl>,
##   `UBE2J2:E7:E7` <dbl>, `SCNN1D:E1:E1` <dbl>, `SCNN1D:E6:E6` <dbl>,
##   `SCNN1D:E7:E7` <dbl>, `SCNN1D:E11:E11` <dbl>, `ACAP3:E22:E22` <dbl>

我们通过factorIDsubregion的{​​{1}}级别进行了明确排序,并添加了一个mutation列来跟踪重复的n + ID行。剩下的就是简单的从长到宽的重塑。


更新

subregion + attribute个值的ID个值相加会稍微改变您的问题陈述;在这种情况下,您可以

subregion

样本数据

df.wide <- df %>%
    mutate(
        ID = factor(ID, levels = unique(.$ID[order(.$mutation)])),
        subregion = factor(subregion, levels = unique(.$subregion[order(.$mutation)]))) %>%
    group_by(ID, subregion) %>%
    summarise(attribute = sum(attribute)) %>%
    spread(subregion, attribute) %>%
    ungroup()
df.wide
## A tibble: 30 x 30
#   ID    `OR4F5:E1:E1` `SAMD11:E2:E2` `NOC2L:E5:E5` `NOC2L:E4:E4` `KLHL17:E3:E3`
#   <fct>         <dbl>          <dbl>         <dbl>         <dbl>          <dbl>
# 1 TCGA…          1.01          NA            NA            NA             NA
# 2 TCGA…         NA              1.00         NA            NA             NA
# 3 TCGA…         NA             NA             1.44         NA             NA
# 4 TCGA…         NA             NA            NA             2.34          NA
# 5 TCGA…         NA             NA            NA            NA              2.18
# 6 TCGA…         NA             NA            NA            NA             NA
# 7 TCGA…         NA             NA            NA            NA             NA
# 8 TCGA…         NA             NA            NA            NA             NA
# 9 TCGA…         NA             NA            NA            NA             NA
#10 TCGA…         NA             NA            NA            NA             NA
## … with 20 more rows, and 24 more variables: `KLHL17:E5:E5` <dbl>,
##   `KLHL17:E8:E8` <dbl>, `KLHL17:E9:E9` <dbl>, `PLEKHN1:E1:E1` <dbl>,
##   `PLEKHN1:E5:E5` <dbl>, `PLEKHN1:E12:E12` <dbl>, `HES4:E3:E3` <dbl>,
##   `ISG15:E2:E2` <dbl>, `AGRN:E2:E2` <dbl>, `AGRN:E3:E3` <dbl>,
##   `AGRN:E4:E4` <dbl>, `AGRN:E8:E8` <dbl>, `AGRN:E25:E25` <dbl>,
##   `AGRN:E29:E29` <dbl>, `AGRN:E36:E36` <dbl>, `TTLL10:E13:E13` <dbl>,
##   `SDF4:E4:E4` <dbl>, `SDF4:E2:E2` <dbl>, `UBE2J2:E7:E7` <dbl>,
##   `SCNN1D:E1:E1` <dbl>, `SCNN1D:E6:E6` <dbl>, `SCNN1D:E7:E7` <dbl>,
##   `SCNN1D:E11:E11` <dbl>, `ACAP3:E22:E22` <dbl>