【问题标题】:Moving from a matrix of character names to a vector of those names (for fMRI data)从字符名称矩阵移动到这些名称的向量(对于 fMRI 数据)
【发布时间】:2021-01-21 20:33:14
【问题描述】:

我有一个 sum(1:235) 的 fMRI 网络连通性下三角矩阵,所以有 27730 个值。我有这些值,但是,我想 cbind 另一个具有这些感兴趣区域 (ROI) 名称的向量,但我不确定如何从这些 ROI 的 236 向量移动到填充的 27730 向量。

所以连接应该是这样的:SN1-SN2, SN1-SN3.....SN1-CB4, SN2-SN3 .... SN2-CB4、SN3-SN4 …SN3-CB4 等等。如果取所有唯一连接,则 236 个 ROI 中的第一个有 235 个连接,第二个 ROI 有 234 个连接,第三个 ROI 有 233 个连接,依此类推。因此,唯一连接总数为 sum(1:235) = 27730。

不过,根据评论,我已将向量更改为仅包含其中 7 个值。

因此,我还将连接更改为 sum(1:8) 值。

非常感谢!

roi <- c("SN2", "SN3", "SN4", "SN5", "CON1", "CON2", "CB4")
connectivities <- rnorm(1:28)

【问题讨论】:

  • 我建议对您的问题进行编辑以改进格式,尽管最后两个似乎值得怀疑:"CB3 " 等,字符串中有空格;这与所有其他字符串不同,所以我想验证一下。请edit您的问题,如果有错误请更正。我编辑它是因为当固定宽度、非常长的数据不需要多行来让我们复制它时,代码真的读起来更好,而且下面的实际代码不太可用。谢谢!
  • 实际上,你不需要 235 个元素来表达你的观点,你可以从(比如说)10 中得到同样的东西。它确实有助于这个过程(你学习编程和我们帮助你) 如果问题要小得多:用更少的数据解决并应用于更多的数据。
  • 是的,感谢您的编辑!我忽略了这一点。我检查了代码,它是正确的,所以我删除了空间。
  • 要点...我已经更改了包含的代码。我在这里缺乏术语来真正解释我正在尝试做的事情,但我确信这是一个非常普通的操作。对不起,如果它是重复的。

标签: r matrix vector


【解决方案1】:

这是一种方法:

m <- outer(roi, roi, paste, sep = "-")
m
#      [,1]       [,2]       [,3]       [,4]       [,5]        [,6]        [,7]      
# [1,] "SN2-SN2"  "SN2-SN3"  "SN2-SN4"  "SN2-SN5"  "SN2-CON1"  "SN2-CON2"  "SN2-CB4" 
# [2,] "SN3-SN2"  "SN3-SN3"  "SN3-SN4"  "SN3-SN5"  "SN3-CON1"  "SN3-CON2"  "SN3-CB4" 
# [3,] "SN4-SN2"  "SN4-SN3"  "SN4-SN4"  "SN4-SN5"  "SN4-CON1"  "SN4-CON2"  "SN4-CB4" 
# [4,] "SN5-SN2"  "SN5-SN3"  "SN5-SN4"  "SN5-SN5"  "SN5-CON1"  "SN5-CON2"  "SN5-CB4" 
# [5,] "CON1-SN2" "CON1-SN3" "CON1-SN4" "CON1-SN5" "CON1-CON1" "CON1-CON2" "CON1-CB4"
# [6,] "CON2-SN2" "CON2-SN3" "CON2-SN4" "CON2-SN5" "CON2-CON1" "CON2-CON2" "CON2-CB4"
# [7,] "CB4-SN2"  "CB4-SN3"  "CB4-SN4"  "CB4-SN5"  "CB4-CON1"  "CB4-CON2"  "CB4-CB4" 

m[upper.tri(m)]
#  [1] "SN2-SN3"   "SN2-SN4"   "SN3-SN4"   "SN2-SN5"   "SN3-SN5"   "SN4-SN5"   "SN2-CON1"  "SN3-CON1"  "SN4-CON1" 
# [10] "SN5-CON1"  "SN2-CON2"  "SN3-CON2"  "SN4-CON2"  "SN5-CON2"  "CON1-CON2" "SN2-CB4"   "SN3-CB4"   "SN4-CB4"  
# [19] "SN5-CB4"   "CON1-CB4"  "CON2-CB4" 

因为roi中有7个,所以第一个元素("SN2")有6个连接;第二个元素 ("SN3") 有五个;等等……总共产生 21 个连接。


另一种方式,使用(并改进)Ben 对combn 的使用:

apply(combn(roi,2), 2, paste, collapse = "-")
#  [1] "SN2-SN3"   "SN2-SN4"   "SN2-SN5"   "SN2-CON1"  "SN2-CON2"  "SN2-CB4"   "SN3-SN4"   "SN3-SN5"   "SN3-CON1" 
# [10] "SN3-CON2"  "SN3-CB4"   "SN4-SN5"   "SN4-CON1"  "SN4-CON2"  "SN4-CB4"   "SN5-CON1"  "SN5-CON2"  "SN5-CB4"  
# [19] "CON1-CON2" "CON1-CB4"  "CON2-CB4" 

【讨论】:

  • 谢谢,我不知道“外部”函数。
  • outer 是一个很好的外笛卡尔积函数,在这种情况下很有用。它相对高效,但使用用户定义的函数可能很难使用。
  • 快速问题:当您在我的问题中更改矢量“roi”时,您使用了哪些代码,而不只是添加了``` ```。我试图弄清楚如何在使用粘贴后删除所有 ROI 之间的“\ \”,但不知道如何。
  • 我复制了 formatted html(隐藏了反斜杠,只显示了引号),然后按原样粘贴到代码块中。我以前从未使用过这种技术,你的技术是我第一次看到所有反斜杠 dbl-quotes。
【解决方案2】:

这是一个包含一组较小值的示例 (7)。对于 7 个值,有 21 种组合:6 + 5 + 4 + 3 + 2 + 1 = 45

roi <- c("SN2", "SN3", "SN4", "SN5", "CON1", "CON2", "CB4")

combn() 函数将所需的输出生成为矩阵:

     [,1]  [,2]  [,3]  [,4]   [,5]   [,6]  [,7]  [,8]  [,9]   [,10]  [,11]
[1,] "SN2" "SN2" "SN2" "SN2"  "SN2"  "SN2" "SN3" "SN3" "SN3"  "SN3"  "SN3"
[2,] "SN3" "SN4" "SN5" "CON1" "CON2" "CB4" "SN4" "SN5" "CON1" "CON2" "CB4"
     [,12] [,13]  [,14]  [,15] [,16]  [,17]  [,18] [,19]  [,20]  [,21] 
[1,] "SN4" "SN4"  "SN4"  "SN4" "SN5"  "SN5"  "SN5" "CON1" "CON1" "CON2"
[2,] "SN5" "CON1" "CON2" "CB4" "CON1" "CON2" "CB4" "CON2" "CB4"  "CB4" 

要获得最终所需的输出,请转置矩阵,转换为 data.frame,然后使用 tidyr 中的 unite() 将两个 roi 值拼接在一起。

library(dplyr) # for the piper %>%
library(tidy)
combn(roi, 2) %>%
  t() %>% as.data.frame() %>%
  unite(col = "combination", sep = "-") 

    combination
1      SN2-SN3
2      SN2-SN4
3      SN2-SN5
4     SN2-CON1
5     SN2-CON2
6      SN2-CB4
7      SN3-SN4
8      SN3-SN5
9     SN3-CON1
10    SN3-CON2
11     SN3-CB4
12     SN4-SN5
13    SN4-CON1
14    SN4-CON2
15     SN4-CB4
16    SN5-CON1
17    SN5-CON2
18     SN5-CB4
19   CON1-CON2
20    CON1-CB4
21    CON2-CB4

【讨论】:

  • 使用combn 的好主意,请参阅我的答案,了解一种无需%&gt;% 和data.framing 开销的使用方法。不错!
猜你喜欢
  • 2011-05-02
  • 1970-01-01
  • 2020-11-16
  • 2018-03-28
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
相关资源
最近更新 更多