【问题标题】:Creating groups of certain size in R according to matrix values根据矩阵值在R中创建一定大小的组
【发布时间】:2020-08-04 08:05:39
【问题描述】:

我有 30 个样本,我想测试它们之间的相互作用。我可以同时测试 4 次交互(第 1 次与第 2 次,第 2 次与第 3 次,第 3 次与第 4 次,第 4 次与第 1 次)。 我想找出 4 个成对交互的最佳组。

我创建了所有成对交互的矩阵:

combinations1 <- combn (specimens, 2, fun = NULL, smiplify = TRUE)

现在我想创建大小为 4 的组,其中第一对的第二个元素与第二对的第一个元素具有相同的值:(a,b), (b,c), (c,d) , (d,a)。

我尝试了 apply 和 external,但是我不知道如何编写函数来获得所需的结果。聚合也可以吗?

我是 R 和编程的新手,在此先抱歉。谢谢! :)

【问题讨论】:

    标签: r matrix grouping


    【解决方案1】:

    基本理念

    由于您打算将事物按 4 分组并在每个组中进行链式配对,因此您实际上通过两个步骤来完成:

    • 通过combn(df, 4, ..., simplify = FALSE) 枚举大小为4 的所有组合,其中simplify = FALSE 在列表中给出结果。
    • combn(...) 中,我们定义了一个函数FUN = function(x) lapply(seq_along(x),function(k) x[c(k,k%%ncol(x)+1)])FUN = function(x) lapply(seq_along(x),function(k) x[c(k,k%%length(x)+1)]),对每个组合执行该函数以生成逐链对。

    代码

    combn(df,4,FUN = function(x) lapply(seq_along(x),function(k) x[c(k,k%%ncol(x)+1)]),simplify = FALSE)
    

    这样

    [[1]]
    [[1]][[1]]
              V1          V2
    1 -0.6264538  0.57578135
    2  0.1836433 -0.30538839
    3 -0.8356286  1.51178117
    4  1.5952808  0.38984324
    5  0.3295078 -0.62124058
    6 -0.8204684 -2.21469989
    7  0.4874291  1.12493092
    8  0.7383247 -0.04493361
    
    [[1]][[2]]
               V2          V3
    1  0.57578135 -0.01619026
    2 -0.30538839  0.94383621
    3  1.51178117  0.82122120
    4  0.38984324  0.59390132
    5 -0.62124058  0.91897737
    6 -2.21469989  0.78213630
    7  1.12493092  0.07456498
    8 -0.04493361 -1.98935170
    
    [[1]][[3]]
               V3          V4
    1 -0.01619026  0.61982575
    2  0.94383621 -0.05612874
    3  0.82122120 -0.15579551
    4  0.59390132 -1.47075238
    5  0.91897737 -0.47815006
    6  0.78213630  0.41794156
    7  0.07456498  1.35867955
    8 -1.98935170 -0.10278773
    
    [[1]][[4]]
               V4         V1
    1  0.61982575 -0.6264538
    2 -0.05612874  0.1836433
    3 -0.15579551 -0.8356286
    4 -1.47075238  1.5952808
    5 -0.47815006  0.3295078
    6  0.41794156 -0.8204684
    7  1.35867955  0.4874291
    8 -0.10278773  0.7383247
    
    
    [[2]]
    [[2]][[1]]
              V1          V2
    1 -0.6264538  0.57578135
    2  0.1836433 -0.30538839
    3 -0.8356286  1.51178117
    4  1.5952808  0.38984324
    5  0.3295078 -0.62124058
    6 -0.8204684 -2.21469989
    7  0.4874291  1.12493092
    8  0.7383247 -0.04493361
    
    [[2]][[2]]
               V2          V3
    1  0.57578135 -0.01619026
    2 -0.30538839  0.94383621
    3  1.51178117  0.82122120
    4  0.38984324  0.59390132
    5 -0.62124058  0.91897737
    6 -2.21469989  0.78213630
    7  1.12493092  0.07456498
    8 -0.04493361 -1.98935170
    
    [[2]][[3]]
               V3          V5
    1 -0.01619026  0.38767161
    2  0.94383621 -0.05380504
    3  0.82122120 -1.37705956
    4  0.59390132 -0.41499456
    5  0.91897737 -0.39428995
    6  0.78213630 -0.05931340
    7  0.07456498  1.10002537
    8 -1.98935170  0.76317575
    
    [[2]][[4]]
               V5         V1
    1  0.38767161 -0.6264538
    2 -0.05380504  0.1836433
    3 -1.37705956 -0.8356286
    4 -0.41499456  1.5952808
    5 -0.39428995  0.3295078
    6 -0.05931340 -0.8204684
    7  1.10002537  0.4874291
    8  0.76317575  0.7383247
    
    
    [[3]]
    [[3]][[1]]
              V1          V2
    1 -0.6264538  0.57578135
    2  0.1836433 -0.30538839
    3 -0.8356286  1.51178117
    4  1.5952808  0.38984324
    5  0.3295078 -0.62124058
    6 -0.8204684 -2.21469989
    7  0.4874291  1.12493092
    8  0.7383247 -0.04493361
    
    [[3]][[2]]
               V2          V4
    1  0.57578135  0.61982575
    2 -0.30538839 -0.05612874
    3  1.51178117 -0.15579551
    4  0.38984324 -1.47075238
    5 -0.62124058 -0.47815006
    6 -2.21469989  0.41794156
    7  1.12493092  1.35867955
    8 -0.04493361 -0.10278773
    
    [[3]][[3]]
               V4          V5
    1  0.61982575  0.38767161
    2 -0.05612874 -0.05380504
    3 -0.15579551 -1.37705956
    4 -1.47075238 -0.41499456
    5 -0.47815006 -0.39428995
    6  0.41794156 -0.05931340
    7  1.35867955  1.10002537
    8 -0.10278773  0.76317575
    
    [[3]][[4]]
               V5         V1
    1  0.38767161 -0.6264538
    2 -0.05380504  0.1836433
    3 -1.37705956 -0.8356286
    4 -0.41499456  1.5952808
    5 -0.39428995  0.3295078
    6 -0.05931340 -0.8204684
    7  1.10002537  0.4874291
    8  0.76317575  0.7383247
    
    
    [[4]]
    [[4]][[1]]
              V1          V3
    1 -0.6264538 -0.01619026
    2  0.1836433  0.94383621
    3 -0.8356286  0.82122120
    4  1.5952808  0.59390132
    5  0.3295078  0.91897737
    6 -0.8204684  0.78213630
    7  0.4874291  0.07456498
    8  0.7383247 -1.98935170
    
    [[4]][[2]]
               V3          V4
    1 -0.01619026  0.61982575
    2  0.94383621 -0.05612874
    3  0.82122120 -0.15579551
    4  0.59390132 -1.47075238
    5  0.91897737 -0.47815006
    6  0.78213630  0.41794156
    7  0.07456498  1.35867955
    8 -1.98935170 -0.10278773
    
    [[4]][[3]]
               V4          V5
    1  0.61982575  0.38767161
    2 -0.05612874 -0.05380504
    3 -0.15579551 -1.37705956
    4 -1.47075238 -0.41499456
    5 -0.47815006 -0.39428995
    6  0.41794156 -0.05931340
    7  1.35867955  1.10002537
    8 -0.10278773  0.76317575
    
    [[4]][[4]]
               V5         V1
    1  0.38767161 -0.6264538
    2 -0.05380504  0.1836433
    3 -1.37705956 -0.8356286
    4 -0.41499456  1.5952808
    5 -0.39428995  0.3295078
    6 -0.05931340 -0.8204684
    7  1.10002537  0.4874291
    8  0.76317575  0.7383247
    
    
    [[5]]
    [[5]][[1]]
               V2          V3
    1  0.57578135 -0.01619026
    2 -0.30538839  0.94383621
    3  1.51178117  0.82122120
    4  0.38984324  0.59390132
    5 -0.62124058  0.91897737
    6 -2.21469989  0.78213630
    7  1.12493092  0.07456498
    8 -0.04493361 -1.98935170
    
    [[5]][[2]]
               V3          V4
    1 -0.01619026  0.61982575
    2  0.94383621 -0.05612874
    3  0.82122120 -0.15579551
    4  0.59390132 -1.47075238
    5  0.91897737 -0.47815006
    6  0.78213630  0.41794156
    7  0.07456498  1.35867955
    8 -1.98935170 -0.10278773
    
    [[5]][[3]]
               V4          V5
    1  0.61982575  0.38767161
    2 -0.05612874 -0.05380504
    3 -0.15579551 -1.37705956
    4 -1.47075238 -0.41499456
    5 -0.47815006 -0.39428995
    6  0.41794156 -0.05931340
    7  1.35867955  1.10002537
    8 -0.10278773  0.76317575
    
    [[5]][[4]]
               V5          V2
    1  0.38767161  0.57578135
    2 -0.05380504 -0.30538839
    3 -1.37705956  1.51178117
    4 -0.41499456  0.38984324
    5 -0.39428995 -0.62124058
    6 -0.05931340 -2.21469989
    7  1.10002537  1.12493092
    8  0.76317575 -0.04493361
    

    编辑

    如果只需要列名,可以试试

    combn(names(df),4,FUN = function(x) lapply(seq_along(x),function(k) x[c(k,k%%length(x)+1)]),simplify = FALSE)
    

    这样

    [[1]]
    [[1]][[1]]
    [1] "V1" "V2"
    
    [[1]][[2]]
    [1] "V2" "V3"
    
    [[1]][[3]]
    [1] "V3" "V4"
    
    [[1]][[4]]
    [1] "V4" "V1"
    
    
    [[2]]
    [[2]][[1]]
    [1] "V1" "V2"
    
    [[2]][[2]]
    [1] "V2" "V3"
    
    [[2]][[3]]
    [1] "V3" "V5"
    
    [[2]][[4]]
    [1] "V5" "V1"
    
    
    [[3]]
    [[3]][[1]]
    [1] "V1" "V2"
    
    [[3]][[2]]
    [1] "V2" "V4"
    
    [[3]][[3]]
    [1] "V4" "V5"
    
    [[3]][[4]]
    [1] "V5" "V1"
    
    
    [[4]]
    [[4]][[1]]
    [1] "V1" "V3"
    
    [[4]][[2]]
    [1] "V3" "V4"
    
    [[4]][[3]]
    [1] "V4" "V5"
    
    [[4]][[4]]
    [1] "V5" "V1"
    
    
    [[5]]
    [[5]][[1]]
    [1] "V2" "V3"
    
    [[5]][[2]]
    [1] "V3" "V4"
    
    [[5]][[3]]
    [1] "V4" "V5"
    
    [[5]][[4]]
    [1] "V5" "V2"
    

    数据

    set.seed(1)
    df <- as.data.frame(matrix(rnorm(40),ncol = 5))
    

    【讨论】:

    • 谢谢,但不完全是。为简化起见,我有 30 个人(细菌类型),所以如果我想用其他人测试每个人,我会得到 435 对。我可以同时测试4个人(a,b,c,d),这也意味着同时测试4对:a-b,b-c,c-d,d-a。因此,我创建了对,我想将这些对分成 4 组,如前所述。
    • 是的,但我没有任何价值观。例如,我有 30 个人,我想知道他们是如何互动的。我可以通过让他们坐在桌子旁来做到这一点。只有坐在每只水獭旁边的人可以互动(我可以测试他们的互动),而不是坐在对角线的人。所以我创建了一对矩阵(2行:一对中的第一个个体和一对中的第二个个体),必须对其进行测试(例如 1-2, 1-3, 1-4, ... , 2-3, 2 -4, 2-5, ... , 29-30)。
    • 所以现在我想创建组:如何每次让 4 人坐在一张桌子上,以便在最短的时间内测试所有个人。我希望这能澄清一些事情?
    • @Katarina_1 我希望我的最新更新符合您的意图
    • 谢谢你,你很接近。但不需要每种组合的数据。我没有每一列的数据。我只需要所有组(四对)的列表。如果您解释了代码的每个部分,那将是惊人的,所以也许我可以自己尝试一下?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    相关资源
    最近更新 更多