【问题标题】:Recoding factor levels using dplyr or tidyverse使用 dplyr 或 tidyverse 重新编码因子水平
【发布时间】:2018-12-19 02:47:44
【问题描述】:

我有一张表格,其中包含不同基因组位点的 3 个风险等位基因水平。最终,我需要为这个表设置一个关键,以识别大量样本中受风险状态影响的不同等位基因的流行程度。我目前有以下风险表的示例:

genomic.stuff <- data.frame(c("A A", "A G", "G A", "G G"), c("T T", "C T", "T C", "C C"),
                        row.names= c("Risk Level 1", "Risk Level 2", "Risk Level 3", "Risk Level 4"),
                        stringsAsFactors = TRUE)
colnames(genomic.stuff) <- c("Gene A", "Gene B")

genomic.stuff
             Gene A Gene B
Risk Level 1    A A    T T
Risk Level 2    A G    C T
Risk Level 3    G A    T C
Risk Level 4    G G    C C

str(genomic.stuff)
'data.frame':   4 obs. of  2 variables:
 $ Gene A: Factor w/ 4 levels "A A","A G","G A",..: 1 2 3 4
 $ Gene B: Factor w/ 4 levels "C C","C T","T C",..: 4 2 3 1

所以我想用这个数据框做两件事。请记住,我有一个包含许多基因的大型映射文件,所以如果这可以在 dplyr 或 tidyverse 中的整个表中完成,那将(我认为?)是最好的。

1) 我想对因素进行重新分级,以便它们根据风险状态排名,而不是根据字母顺序自动分级(数据框已经存在,所以我认为我不能在数据框构造)

2) 我想重新分配因子级别,使得风险级别 1 = 1,风险级别 2 | 3 = 2,风险等级 4=3。

非常感谢大家的帮助!

【问题讨论】:

  • 为什么Risk Levelrow.name?为什么不是自己的专栏?
  • 行名对我的花生大脑来说是有意义的,但我当然可以将它变成一列,就像你在下面所做的那样。但我不确定这在解决问题方面对我有什么帮助。
  • 将其设为一列可让您基于此“风险级别”进行重构,当且仅当它是数字时。然而,基因本身的水平并没有改变。

标签: r dplyr refactoring tidyverse


【解决方案1】:

您需要创建Risk Level numeric 并按如下方式重新排序:

编辑:您可以选择重新分类风险等级。

 library(tidyverse)
genomic.stuff <- data.frame(c("A A", "A G", "G A", "G G"), c("T T", "C T", "T C", "C C"),
                            row.names= c("Risk Level 1", "Risk Level 2", "Risk Level 3", "Risk Level 4"),
                            stringsAsFactors = TRUE)
colnames(genomic.stuff) <- c("Gene A", "Gene B")

    new_genome<-genomic.stuff %>% 
      mutate(RiskLevel=as.factor(c(1,2,3,4))) %>% 
      mutate(RiskLevel=as.numeric(c(1,2,2,4)),`Gene A`=fct_reorder(`Gene A`,RiskLevel),
             `Gene B`=fct_reorder(`Gene B`,RiskLevel)) 
    levels(new_genome$RiskLevel)
    levels(as.factor(new_genome$RiskLevel))

【讨论】:

  • 感谢您的评论。所以我运行了代码,它让我更接近了,但我希望以 3 个因子水平结束(w/RL1、RL2=RL3、RL4),但基因 A 和基因 B 仍然被 4 个水平因子考虑 > 基因组.stuff % + mutate(RiskLevel=as.numeric(c(1,2,2,4)),Gene A=fct_reorder(Gene A,RiskLevel), + Gene B=fct_reorder(@987654327 @,RiskLevel)) > str(genomic.stuff) 'data.frame': 4 obs。 3 个变量:$ 基因 A:因子 w/ 4 个水平“A A”、“A G”、“G A”、..:1 2 3 4 $ 基因 B:因子 w/4 个水平“T T”、“C T”、 T C",..: 1 2 3 4 $ 风险等级: num 1 2 2 4
  • 我将继续努力接近这一点,但我认为基于另一列重新排序它们会“重新映射”它们,尽管它们保持不变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 2016-10-23
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多