2017-03-09 93 views
2

我有两个数据集:从R中缺少列名替换另一个数据框中的列名?

a。看起来像这样的数据帧:

 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)不具有相应的“订单”(B)。

我想将数据集(2)中的Order列与数据框(1)中的对应物种相匹配,并将相同Order下的值(如果有多个物种)相加。当有供种(eg.SpeciesY,SpeciesZ)没有相应的订单,我要重命名的列空,然后将其删除(注意:我需要两个步骤)

预决赛输出

  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功能大部分代码的扩展。但是,我发现很难对此进行相同的分析,因为它会吐出一个错误,指出某些物种没有对应的值。

回答

2

一种方法是创建一个索引,其中数据集的子集为matchsplit使用Order柱,遍历list元素,并获得rowSums

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 

或者我们可以把第一个数据集,以“长”格式,与第二,按列分组加入,得到的sum值列并重塑回“宽”

library(tidyverse) 
rownames_to_column(df1, "rn") %>% 
     gather(Species, Val, -rn) %>% 
     left_join(., df2, by = "Species") %>% 
     na.omit() %>% 
     group_by(rn, Order) %>% 
     summarise(Val = sum(Val)) %>% 
     spread(Order, Val) 
+0

我不知道是什么比赛是干什么的,但是当我运行它,我看到I1正在值比DF1列的数目更大。例如。我有i1作为(1,522,4 ..等)的矢量。当我运行df1 [i1]时,表示选择了未定义的列 – Ash

+0

上面的注释参考代码 – Ash

+1

中的选项(1)我想到了。我认为我的结局出现了一个小故障。现在运作良好! – Ash

相关问题