根据 r 中的簇对特定列求和或分组

sum or group specific columns based on clusters in r

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

  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" 在第 2 组中,依此类推.

我试图想出一个代码,该代码使用第二个数据框中的引用按簇对列进行分组并对它们求和。我试图用 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)]))

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

尝试添加与 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