我有两个数据集:
一个。一个如下所示的数据框:
SpeciesA SpeciesB SpeciesC SpeciesD SpeciesE SpeciesY SpeciesZ
Site1 1 0 4 6 2 5 2
Site2 1 0 4 6 2 5 3
Site3 1 0 4 6 2 5 4
Site4 1 0 4 6 2 5 5
(注意:行值不相同。这只是为了表示这里的目的)
湾另一个看起来像这样的数据集:
Order Species
Order1 SpeciesA
Order1 SpeciesB
Order2 SpeciesC
Order2 SpeciesD
Order3 SpeciesE
请注意,某些物种(例如SpeciesZ,SpeciesY)没有相应的" Order"在(b)中。
我希望将数据集(2)中的Order列与数据框(1)中的相应Species相匹配,并将相同Order下的值(如果有多个种类)相加。如果物种没有相应的订单(例如.SpeciesY,SpeciesZ),我想将列重命名为NULL,然后将其删除(注意我需要两个步骤)
预赛决赛
Order1 Order1 Order3 NULL NULL
Site1 1 10 2 5 2
Site2 1 10 2 5 3
Site3 1 10 2 5 4
Site4 1 10 2 5 5
最终输出
Order1 Order2 Order3
Site1 1 10 2
Site2 1 10 2
Site3 1 10 2
Site4 1 10 2
这是问题asked here的扩展,其中大部分代码都使用dplyr
或melt
/ reshape
函数。但是,我发现难以对此进行相同的分析,因为它会吐出一个错误,说某些物种没有相应的值
答案 0 :(得分:2)
一种方法是使用match
列创建包含split
,Order
数据集子集的索引,循环遍历list
元素并获取{{1 }}
rowSums
或者我们可以将第一个数据集转换为&#39; long&#39;格式,与第二个连接,按列分组,获取值列的i1 <- match(colnames(df1), df2$Species, nomatch = 0)
data.frame(lapply(split.default(df1[i1], df2$Order[i1]), rowSums))
# Order1 Order2 Order3
#Site1 1 10 2
#Site2 1 10 2
#Site3 1 10 2
#Site4 1 10 2
并将其重新整形为“&#39; wide&#39;
sum