【问题标题】:Reorder row names of a matrices in a list and replace NaN and zeros with ones重新排序列表中矩阵的行名,并将 NaN 和零替换为一
【发布时间】:2020-06-29 03:23:07
【问题描述】:

我有一个矩阵列表,我需要对它们的行名进行排序。我有 7 个字母评级类别,但行名是由连字符分隔的两个评级的组合。我希望根据连字符前的评级对行名进行排序。解决此问题后,我想将 NaN 值和 0 值转换为 1,因为我必须记录矩阵中每个元素的日志。但是,当我将 NaN 替换为 1,然后继续将 0 值替换为 1 时,NaN 值会再次出现。

对象 row.order 包含我要遵循的顺序。

row.order <- c("Aaa", "Aa", "A", "Baa", "Ba", "B", "Caa")

矩阵列表的输出:

dput(phij.list)
list(structure(c(0.375, 0.268292682926829, 0.384615384615385, 
NaN, NaN, 0.222222222222222, NaN, 0.4375, 0.51219512195122, 0.282051282051282, 
NaN, NaN, 0.444444444444444, NaN, 0.0625, 0.195121951219512, 
0.230769230769231, NaN, NaN, 0.333333333333333, NaN, 0.125, 0.024390243902439, 
0.0769230769230769, NaN, NaN, 0, NaN, 0, 0, 0.0256410256410256, 
NaN, NaN, 0, NaN, 0, 0, 0, NaN, NaN, 0, NaN, 0, 0, 0, NaN, NaN, 
0, NaN), .Dim = c(7L, 7L), .Dimnames = list(hi = c("A-Aaa", "Aa-Aaa", 
"Aaa-Aaa", "B-Aaa", "Ba-Aaa", "Baa-Aaa", "Caa-Aaa"), j = c("Aaa", 
"Aa", "A", "Baa", "Ba", "B", "Caa"))), structure(c(0.0425531914893617, 
0.0641509433962264, 0.27906976744186, 0.0714285714285714, 0, 
0.0625, 0, 0.425531914893617, 0.532075471698113, 0.418604651162791, 
0.428571428571429, 0.551724137931034, 0.453125, 0, 0.304964539007092, 
0.211320754716981, 0.162790697674419, 0.214285714285714, 0.275862068965517, 
0.25, 0, 0.113475177304965, 0.132075471698113, 0.116279069767442, 
0.142857142857143, 0.137931034482759, 0.140625, 0, 0.0921985815602837, 
0.0452830188679245, 0.0232558139534884, 0.142857142857143, 0, 
0.0625, 1, 0.0212765957446809, 0.0150943396226415, 0, 0, 0.0344827586206897, 
0.03125, 0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(7L, 7L), .Dimnames = list(
    hi = c("A-Aa", "Aa-Aa", "Aaa-Aa", "B-Aa", "Ba-Aa", "Baa-Aa", 
    "Caa-Aa"), j = c("Aaa", "Aa", "A", "Baa", "Ba", "B", "Caa"
    ))), structure(c(0.00769230769230769, 0.0775193798449612, 
0.0869565217391304, 0, 0, 0.00671140939597315, 0, 0.188461538461538, 
0.317829457364341, 0.173913043478261, 0.296296296296296, 0.037037037037037, 
0.23489932885906, 0.5, 0.496153846153846, 0.341085271317829, 
0.478260869565217, 0.333333333333333, 0.462962962962963, 0.342281879194631, 
0, 0.207692307692308, 0.193798449612403, 0.260869565217391, 0.222222222222222, 
0.333333333333333, 0.281879194630872, 0.5, 0.0884615384615385, 
0.062015503875969, 0, 0.111111111111111, 0.111111111111111, 0.087248322147651, 
0, 0.00384615384615385, 0.00775193798449612, 0, 0.037037037037037, 
0.0555555555555556, 0.0402684563758389, 0, 0.00769230769230769, 
0, 0, 0, 0, 0.00671140939597315, 0), .Dim = c(7L, 7L), .Dimnames = list(
    hi = c("A-A", "Aa-A", "Aaa-A", "B-A", "Ba-A", "Baa-A", "Caa-A"
    ), j = c("Aaa", "Aa", "A", "Baa", "Ba", "B", "Caa"))), structure(c(0.0196078431372549, 
0.0434782608695652, 0.166666666666667, 0, 0, 0.0116959064327485, 
0, 0.163398692810458, 0.159420289855072, 0.666666666666667, 0.0571428571428571, 
0.0648148148148148, 0.0994152046783626, 0, 0.300653594771242, 
0.347826086956522, 0.166666666666667, 0.285714285714286, 0.222222222222222, 
0.251461988304094, 0.333333333333333, 0.274509803921569, 0.260869565217391, 
0, 0.314285714285714, 0.37037037037037, 0.350877192982456, 0.333333333333333, 
0.163398692810458, 0.130434782608696, 0, 0.228571428571429, 0.194444444444444, 
0.233918128654971, 0.333333333333333, 0.065359477124183, 0.0579710144927536, 
0, 0.114285714285714, 0.12037037037037, 0.0526315789473684, 0, 
0.0130718954248366, 0, 0, 0, 0.0277777777777778, 0, 0), .Dim = c(7L, 
7L), .Dimnames = list(hi = c("A-Baa", "Aa-Baa", "Aaa-Baa", "B-Baa", 
"Ba-Baa", "Baa-Baa", "Caa-Baa"), j = c("Aaa", "Aa", "A", "Baa", 
"Ba", "B", "Caa"))), structure(c(0, 0, 0, 0, 0, 0, 0, 0.150943396226415, 
0.212121212121212, 1, 0.02, 0.0285714285714286, 0.0925925925925926, 
0, 0.264150943396226, 0.272727272727273, 0, 0.06, 0.104761904761905, 
0.138888888888889, 0.214285714285714, 0.415094339622642, 0.212121212121212, 
0, 0.12, 0.238095238095238, 0.333333333333333, 0.0714285714285714, 
0.0754716981132075, 0.272727272727273, 0, 0.4, 0.333333333333333, 
0.305555555555556, 0.214285714285714, 0.0754716981132075, 0, 
0, 0.36, 0.247619047619048, 0.101851851851852, 0.357142857142857, 
0.0188679245283019, 0.0303030303030303, 0, 0.04, 0.0476190476190476, 
0.0277777777777778, 0.142857142857143), .Dim = c(7L, 7L), .Dimnames = list(
    hi = c("A-Ba", "Aa-Ba", "Aaa-Ba", "B-Ba", "Ba-Ba", "Baa-Ba", 
    "Caa-Ba"), j = c("Aaa", "Aa", "A", "Baa", "Ba", "B", "Caa"
    ))), structure(c(0, 0, NaN, 0, 0, 0, 0, 0, 0.2, NaN, 0.0508474576271186, 
0.0476190476190476, 0.128205128205128, 0.0476190476190476, 0.25, 
0.2, NaN, 0.101694915254237, 0.142857142857143, 0.179487179487179, 
0, 0.333333333333333, 0.4, NaN, 0.0677966101694915, 0.174603174603175, 
0.230769230769231, 0.0952380952380952, 0.25, 0.2, NaN, 0.271186440677966, 
0.238095238095238, 0.256410256410256, 0.19047619047619, 0.166666666666667, 
0, NaN, 0.355932203389831, 0.285714285714286, 0.153846153846154, 
0.523809523809524, 0, 0, NaN, 0.152542372881356, 0.111111111111111, 
0.0512820512820513, 0.142857142857143), .Dim = c(7L, 7L), .Dimnames = list(
    hi = c("A-B", "Aa-B", "Aaa-B", "B-B", "Ba-B", "Baa-B", "Caa-B"
    ), j = c("Aaa", "Aa", "A", "Baa", "Ba", "B", "Caa"))), structure(c(0, 
NaN, NaN, 0, 0, 0, 0, 0, NaN, NaN, 0, 0, 0.142857142857143, 0, 
0, NaN, NaN, 0, 0.142857142857143, 0, 0, 0.333333333333333, NaN, 
NaN, 0.0526315789473684, 0.214285714285714, 0, 0.0666666666666667, 
0.666666666666667, NaN, NaN, 0.263157894736842, 0.142857142857143, 
0.428571428571429, 0.0666666666666667, 0, NaN, NaN, 0.473684210526316, 
0.214285714285714, 0.285714285714286, 0.466666666666667, 0, NaN, 
NaN, 0.210526315789474, 0.285714285714286, 0.142857142857143, 
0.4), .Dim = c(7L, 7L), .Dimnames = list(hi = c("A-Caa", "Aa-Caa", 
"Aaa-Caa", "B-Caa", "Ba-Caa", "Baa-Caa", "Caa-Caa"), j = c("Aaa", 
"Aa", "A", "Baa", "Ba", "B", "Caa"))))

我用来将 NaN 更改为 1 的代码:

lapply(phij.list, function(x) replace(x, !is.finite(x), 1))

我用来将 0 值更改为 1 的代码

lapply(phij.list, function(x) replace(x, x==0, 1))

【问题讨论】:

    标签: r list matrix


    【解决方案1】:

    您可以使用sub 删除行名中“-”之后的文本,然后使用match 删除它们与row.order 以获得正确的顺序。然后我们可以replaceNaN 和 0 值与 1。

    new_list <- lapply(phij.list, function(x) {
       temp <- x[match(sub('-.*', '', rownames(x)), row.order), ]
       replace(temp, is.nan(temp) | temp == 0, 1)
    })
    
    
    #[[1]]
    #         j
    #hi          Aaa    Aa      A    Baa     Ba B Caa
    #  Aaa-Aaa 0.385 0.282 0.2308 0.0769 0.0256 1   1
    #  Aa-Aaa  0.268 0.512 0.1951 0.0244 1.0000 1   1
    #  A-Aaa   0.375 0.438 0.0625 0.1250 1.0000 1   1
    #  Baa-Aaa 0.222 0.444 0.3333 1.0000 1.0000 1   1
    #  Ba-Aaa  1.000 1.000 1.0000 1.0000 1.0000 1   1
    #  B-Aaa   1.000 1.000 1.0000 1.0000 1.0000 1   1
    #  Caa-Aaa 1.000 1.000 1.0000 1.0000 1.0000 1   1
    
    #[[2]]
    #        j
    #hi          Aaa    Aa     A   Baa     Ba      B Caa
    #  Aaa-Aa 0.2791 0.419 0.163 0.116 0.0233 1.0000   1
    #  Aa-Aa  0.0642 0.532 0.211 0.132 0.0453 0.0151   1
    #  A-Aa   0.0426 0.426 0.305 0.113 0.0922 0.0213   1
    #  Baa-Aa 0.0625 0.453 0.250 0.141 0.0625 0.0312   1
    #  Ba-Aa  1.0000 0.552 0.276 0.138 1.0000 0.0345   1
    #  B-Aa   0.0714 0.429 0.214 0.143 0.1429 1.0000   1
    #  Caa-Aa 1.0000 1.000 1.000 1.000 1.0000 1.0000   1
    #...
    #...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-05
      • 2017-02-11
      • 2020-06-04
      • 2013-03-12
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多