首页 文章

基于r中的簇的总和或组特定列

提问于
浏览
1

所以我有一个物种和丰度的数据集,这里有一个样本:

aca.qua aca.bah aca.chi achi.lin alb.vul alu.mon ani.vir arc.rho asp.lun aux.roc bag.bag bag.mar bal.cap cal.cal cal.pen
1       0       0       0        0       5       0      57       0       0       0       0       0       0       0      16
2       0       0       1        0       2       0       3       0       0       0       0       8       0       0       0
3       0       0       0        0       1       0       3       0       0       0       0       0       0       0       3
4       0       0       0        0       5       0       0       0      22       0       0      94       0       0       0
5       0       0       0        0       1       0       0       0       0       2       3       2       0       0       1
6       0       0       0        0       0       0       0       1       0       0       2       2       0       0       0

A对一些物种特征进行了聚类分析,得出了一些聚类,每个物种都应包括在内:

aca.qua  aca.bah  aca.chi achi.lin  alb.vul  alu.mon  ani.vir  arc.rho  asp.lun  aux.roc  bag.bag  bag.mar  bal.cap cal.cal  cal.pen
   1        1        1        2        3        1        4        4        1        5        4        4        1       1        1

“aca.qua”应该在第1组,以及第二组中的“aca.bah”,“aca.chi”和“alu.mon”等“achi.lin”,依此类推 .

我试图提出一个代码,该代码使用第二个数据框中的引用按簇对列进行分组并对它们求和 . 我试图用dplyr,mutate和一些循环这样做,但我从来没有设法做到这一点的好方法 . 我尝试使用t()转换和select(),然后转置回来等添加簇作为一行,它变得太复杂了 .

有什么方法可以使用包含物种名称的矢量和它的簇作为参考来对每个簇的各列进行求和?

想法是最终得到这样的东西,但对于所有的集群:

V34 V35 V36 V37 V38 V39 V40 V41 V42 V43 cluster1
1   1   0   0   0   0   0   0   0   0   0        0
2   0   0   0   0   0   0   0   0   0   0        0
3   0   0   0   0   0   0   0   0   0   0        1
4   1   0   0   0   0   0   0   0   0   0        0
5   0   0   1   0   0   0   0   1   0   0       22
6   0   1   0   0   0   0   0   0   0   0        0

这里我使用了以下代码:

teste4 <- teste3 %>%
        filter(V1 == 1) %>%
        select(-1)
teste5 <- teste4 %>%
        mutate(cluster1 = rowSums(teste4[, 1:rowSums(teste4)]))

这里的要点是我还将尝试几种不同的聚类方法和模型,因此,当我想出新的聚类组合而不是手动选择每一列时,我需要以某种方式使它更自动(原始数据集更大 .

1 回答

  • 2

    尝试使用 rowSums 添加与每个群集匹配的行 . 我们可以将它包装在一个 lapply 调用中,以循环遍历每个唯一的集群:

    lst <- lapply(1:max(df2[1,]), function(x) rowSums(df1[,df2[1,] == x, drop=F]))
    setNames(data.frame(lst),paste0("clust",1:length(lst)))
    #   clust1 clust2 clust3 clust4 clust5
    # 1     16      0      5     57      0
    # 2      1      0      2     11      0
    # 3      3      0      1      3      0
    # 4     22      0      5     94      0
    # 5      1      0      1      5      2
    # 6      0      0      0      5      0
    

相关问题