下面,我有以下由变量mutation
排序的数据。我正在使用xtabs
根据ID
的值将因子变量subregion
(列)与因子变量attribute
(行)交叉制表。要按照它们在数据集中出现的顺序重新排序,我使用forcats::fct_reorder
。基于(截断的)输出,这可以与下面给出的非常小的数据集一起使用。但是,我的数据有966个唯一的ID
和〜58000个唯一的subregions
。当我运行如下类似的代码时,它不会按正确的顺序给出列和行。
出现在数据集中较早的个体可能会在以后重复出现,因为它们在较晚的位置发生突变,但是子区域不会在数据集中的较后出现,因为它们是由其位置决定的。另外,对于重复的ID
和subregion
(请参阅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
答案 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>
我们通过factor
对ID
和subregion
的{{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>