【问题标题】:How to conditionally loop on a list in r如何有条件地循环r中的列表
【发布时间】:2021-08-27 05:43:20
【问题描述】:

我对 r 不专业,需要您帮助解决这个问题 - 我有一个名为 result 的列表,里面有不同的项目,如下所示:

结果:

$r
              0610007P14Rik 0610009B22Rik 0610009O20Rik 0610010F05Rik 0610010K14Rik 0610011F06Rik 0610012G03Rik 0610030E20Rik 0610037L13Rik
0610007P14Rik    0.00000000   -0.66234644   0.047111033    0.09782589   0.145761085   0.084414075    0.05975822    0.10952475  -0.020151257
0610009B22Rik   -0.16234644    0.00000000  -0.227292854   -0.05088201  -0.100237074   0.078595470   -0.12782382   -0.05553298   0.012588413

$p
              0610007P14Rik 0610009B22Rik 0610009O20Rik 0610010F05Rik 0610010K14Rik 0610011F06Rik 0610012G03Rik 0610030E20Rik 0610037L13Rik
0610007P14Rik     1.0000000     0.04047111     0.6405067     0.3310033     0.1459042     0.4019556  5.534329e-01     0.2760502  8.417704e-01
0610009B22Rik    0.1047111     1.0000000     0.44868459     0.6139574     0.3191458     0.4353240  2.029875e-01     0.5818857  9.007631e-01

如果 result$r 是 > 然后是 0.5< 而不是 -0.5 - 和 result$p < 而不是 0.05,我想要做的是循环这个列表并打印对。

到目前为止,我已经能够通过一个简单的循环遍历列表,我可以在列表中的特定位置打印任何值,但无法扩展它以执行我的目标:

for (i in 1:length(result)){
  print(result[[i]][2])
}

所以根据上面的例子 - 输出应该是这样的,因为这是唯一一对 result$r 值小于 -0.5 且 result$p

0610007P14Rik,0610009B22Rik

感谢任何帮助 - 谢谢。

输入(结果)

list(r = structure(c(0, -0.662346440956915, 0.0471110327396697, 
0.0978258929200013, 0.14576108466075, 0.0844140746798007, 0.0597582241031368, 
0.10952475161027, -0.0201512568819922, -0.162346440956915, 0, 
-0.0272928544838261, -0.0508820105675817, -0.100237073610376, 
0.0785954698120888, -0.127823820999628, -0.0555329766448806, 
0.0125884127823821, 0.0471110327396697, -0.0272928544838261, 
0, -0.0565079080178134, 0.13575892944611, 0.0754843375985575, 
0.086120417719783, 0.119119974969681, 0.00175356100237076, 0.0978258929200013, 
-0.0508820105675817, -0.0565079080178134, 0, 0.131775445763479, 
0.053017452395846, 0.0712198787836846, -0.0643888838089917, 0.112498034323393, 
0.14576108466075, -0.100237073610376, 0.13575892944611, 0.131775445763479, 
0, 0.00774829446850978, -0.0987186269323458, 0.0147657064131866, 
0.0300260585042811, 0.0844140746798007, 0.0785954698120888, 0.0754843375985575, 
0.053017452395846, 0.00774829446850978, 0, 0.10393741385522, 
0.0236032173803311, -0.0182926697871553, 0.0597582241031368, 
-0.127823820999628, 0.086120417719783, 0.0712198787836846, -0.0987186269323458, 
0.10393741385522, 0, -0.0287458971316651, -0.378837751523345, 
0.10952475161027, -0.0555329766448806, 0.119119974969681, -0.0643888838089917, 
0.0147657064131866, 0.0236032173803311, -0.0287458971316651, 
0, 0.137186835947971, -0.0201512568819922, 0.0125884127823821, 
0.00175356100237076, 0.112498034323393, 0.0300260585042811, -0.0182926697871553, 
-0.378837751523345, 0.137186835947971, 0), .Dim = c(9L, 9L), .Dimnames = list(
    c("0610007P14Rik", "0610009B22Rik", "0610009O20Rik", "0610010F05Rik", 
    "0610010K14Rik", "0610011F06Rik", "0610012G03Rik", "0610030E20Rik", 
    "0610037L13Rik"), c("0610007P14Rik", "0610009B22Rik", "0610009O20Rik", 
    "0610010F05Rik", "0610010K14Rik", "0610011F06Rik", "0610012G03Rik", 
    "0610030E20Rik", "0610037L13Rik"))), p = structure(c(1, 0.0404711061993476, 
0.640506733726655, 0.331003274745838, 0.145904233294019, 0.401955560275036, 
0.553432861540715, 0.276050189693768, 0.841770371470927, 0.104711061993476, 
1, 0.786845892450507, 0.613957357859433, 0.319145768537945, 0.4353239557619, 
0.202987516780359, 0.581885722125544, 0.900763057605725, 0.640506733726655, 
0.786845892450507, 1, 0.575261418533015, 0.17603176034094, 0.453788945686311, 
0.392462976283337, 0.23580507604055, 0.986141912945937, 0.331003274745838, 
0.613957357859433, 0.575261418533015, 1, 0.189217146197476, 0.599137018214154, 
0.479787539192647, 0.523038223686805, 0.263117246150375, 0.145904233294019, 
0.319145768537945, 0.17603176034094, 0.189217146197476, 1, 0.93882240484224, 
0.326580916483781, 0.88370977100432, 0.766081848734211, 0.401955560275036, 
0.4353239557619, 0.453788945686311, 0.599137018214154, 0.93882240484224, 
1, 0.3014852587724, 0.815110528089105, 0.85620041392968, 0.553432861540715, 
0.202987516780359, 0.392462976283337, 0.479787539192647, 0.326580916483781, 
0.3014852587724, 1, 0.775787682483708, 7.84039808365529e-05, 
0.276050189693768, 0.581885722125544, 0.23580507604055, 0.523038223686805, 
0.88370977100432, 0.815110528089105, 0.775787682483708, 1, 0.17147275199326, 
0.841770371470927, 0.900763057605725, 0.986141912945937, 0.263117246150375, 
0.766081848734211, 0.85620041392968, 7.84039808365529e-05, 0.17147275199326, 
1), .Dim = c(9L, 9L), .Dimnames = list(c("0610007P14Rik", "0610009B22Rik", 
"0610009O20Rik", "0610010F05Rik", "0610010K14Rik", "0610011F06Rik", 
"0610012G03Rik", "0610030E20Rik", "0610037L13Rik"), c("0610007P14Rik", 
"0610009B22Rik", "0610009O20Rik", "0610010F05Rik", "0610010K14Rik", 
"0610011F06Rik", "0610012G03Rik", "0610030E20Rik", "0610037L13Rik"
))))

【问题讨论】:

    标签: r list for-loop


    【解决方案1】:

    您不应该遍历列表,因为列表是固定格式,并且您知道有 $r$p 元素。相反,您应该遍历您拥有的行和列:

    for(row in rownames(result$p)){
      for(col in colnames(result$p)){
        if(abs(result$r[row,col])>.5 & result$p[row,col]<.05){
          print(paste(row,col,sep=", "))
        }
      }
    }
    

    输出是:

    "0610009B22Rik, 0610007P14Rik"
    

    这是唯一符合您标准的相关性(r=-.66,p=.040)

    【讨论】:

    • 亲爱的@Martin - 我更新了这个问题,所以现在根据示例和dput(result) 输出应该看起来像0610007P14Rik,0610009B22Rik - 谢谢你的帮助。我试过你以前的答案,它给出了结构错误。
    • 谢谢。我更新了代码。里面有一个错字。现在,它工作正常。
    【解决方案2】:

    如果rp 矩阵的维度相同,您可以直接进行比较。

    inds <- which(result$r > 0.5 | result$r < -0.5 & result$p < 0.05, arr.ind = TRUE)
    
    cbind(row = rownames(result$p)[inds[, 1]], 
          col = colnames(result$p)[inds[, 2]])
    
    #                row             col            
    #[1,] "0610009B22Rik" "0610007P14Rik"
    

    【讨论】:

      猜你喜欢
      • 2013-07-13
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 2016-03-19
      • 2017-07-27
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      相关资源
      最近更新 更多