如何在 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"))
它创建了一个新的因素,具有相同的数据,只是这次水平是按莱特顺序排列的。
如果有更好的解决方案,我很乐意听到。
:)
谢谢!
我正在用 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"))
它创建了一个新的因素,具有相同的数据,只是这次水平是按莱特顺序排列的。
如果有更好的解决方案,我很乐意听到。 :) 谢谢!