如何在 R 中处理矩阵中的因子

How to work with factors in matrices in R

我正在用 R 调试其他人的代码。我在一个名为 seg 的矩阵中有数据,它看起来像这样- head(seg)

id | chr | start | end | test | ref | position | log2

102G.bam.vs.ref1.hits | 1 | 100350001 | 101250000 | 986 | 1933 | 100800000 | -0.179835 102G.bam.vs.ref1.hits | 1 | 100800001 | 101700000 | 1104 | 2113 | 101250000 | -0.145205 102G.bam.vs.ref1.hits | 1 | 101250001 | 102150000 | 1062 | 1874 | 101700000 | -0.0279899 102G.bam.vs.ref1.hits | 1 | 101700001 | 102600000 | 893 | 1610 | 102150000 | -0.0589814 102G.bam.vs.ref1.hits | 1 | 102150001 | 103050000 | 737 | 1394 | 102600000 | -0.128147

他在他的情节中使用 facet_grid(id~chr),其中一个问题是染色体的顺序不正确,它们按字母顺序排序(这意味着 10-19 号染色体出现在 2- 号染色体之前9,依此类推),chr 列的级别顺序错误。 levels(seg$chr)

[1] "1" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "2" "20" "21" "22" "3" "4"

[18] "5" "6" "7" "8" "9" "M" "X" "Y"

我尝试更改级别的顺序,但是当我这样做时,数据也发生了变化,例如,如果我尝试这样做 levels(seg$chr) = c(22:1, "M", "X", "Y")

head(seg)

id | chr | start | end | test | ref | position | log2

102G.bam.vs.ref1.hits | 22 | 100350001 | 101250000 | 986 | 1933 | 100800000 | -0.179835 102G.bam.vs.ref1.hits | 22 | 100800001 | 101700000 | 1104 | 2113 | 101250000 | -0.145205 102G.bam.vs.ref1.hits | 22 | 101250001 | 102150000 | 1062 | 1874 | 101700000 | -0.0279899 102G.bam.vs.ref1.hits | 22 | 101700001 | 102600000 | 893 | 1610 | 102150000 | -0.0589814 102G.bam.vs.ref1.hits | 22 | 102150001 | 103050000 | 737 | 1394 | 102600000 | -0.128147

因此,例如,如果我使用 levels(seg$chr) = c(1:22, "M", "X", "Y"),标签将是正确的,但来自 10 号染色体的所有数据都将指代 2 号染色体。

我希望数据保持原样,只更改因子水平的顺序(图的顺序),我可能遗漏了一些关于如何使用因子的非常基本的东西。

谢谢!

好的,我找到了避免这种情况的方法,虽然不是很优雅,但是很管用。 我没有像我那样直接更改因子水平,而是使用相同的数据创建了一个新因子,并用它替换了之前的因子。

而不是这个- levels(seg$chr) = c(1:22, "M","X","Y") 这改变了因素本身,也改变了数据。 我用这个- seg$chr = factor(seg$chr, levels = c(1:22, "M","X","Y")) 它创建了一个新的因素,具有相同的数据,只是这次水平是按莱特顺序排列的。

如果有更好的解决方案,我很乐意听到。 :) 谢谢!