所以我有一个物种和丰度的数据集,这是一个样本:
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”等,第2组中的“achi.lin”等等。< / p>
我试图想出一个代码,该代码使用第二个数据框中的引用按簇对列进行分组并对它们求和。我试图用dplyr,mutate和一些循环这样做,但我从来没有设法做到这一点的好方法。我尝试使用t()转换并选择(),然后转置回等等,将簇添加为行,这样做太复杂了。
有什么方法可以使用包含物种名称的矢量和它的簇作为参考来对每个簇的各列进行求和?
这个想法是最终得到这样的东西,但对于所有的集群:
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)]))
这里的要点是我还会尝试几种不同的聚类方法和模型,因此,当我想出新的聚类组合而不是手动选择每一列时,我需要以某种方式使它更自动(原始数据集要大得多)
答案 0 :(得分: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