从R中缺少列名的另一个数据帧替换列名?

时间:2017-03-09 01:39:31

标签: r merge matching missing-data

我有两个数据集:

一个。一个如下所示的数据框:

        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的扩展,其中大部分代码都使用dplyrmelt / reshape函数。但是,我发现难以对此进行相同的分析,因为它会吐出一个错误,说某些物种没有相应的值

1 个答案:

答案 0 :(得分:2)

一种方法是使用match列创建包含splitOrder数据集子集的索引,循环遍历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