2017-03-09 91 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

相關問題