2017-06-07 62 views
1

我會總結我得到了我的工作夥伴dataframes:如何添加與另一列相對應的值的列?

 name abundance 
1 joe 1 
2 tim 1 
3 bob 1 
4 joe 1 
5 bob 1 

首先,我通過聚合列上創建一個新的數據幀,並計算出的相對freqeuency會是什麼:

 name abundance relative_ab 
1 joe 2   0.4 
2 tim 1   0.2 
3 bob 2   0.4 

但我想爲第一個數據框添加一列,以便像relative_ab那樣存在多餘條目(實際數據集中包含其他信息,並且我將通過聚合它們而丟失信息)。

 name abundance relative_ab 
1 joe 1   0.4 
2 tim 1   0.2 
3 bob 1   0.4 
4 joe 1   0.4 
5 bob 1   0.4 

我想我可以蠻力,但我是比較新的R和琢磨光滑的方式你們會想出。

謝謝!

+0

'合併做到這一點' – HubertL

回答

0

你可以用match來做到這一點。假設你的第一個data.frame是DF1,第二個是DF2,你可以使用:

df1$relative_ab = df2$relative_ab[match(df1$name, df2$name)] 
df1 
    name abundance relative_ab 
1 joe   1   0.4 
2 tim   1   0.2 
3 bob   1   0.4 
4 joe   1   0.4 
5 bob   1   0.4 

match使用該名稱選擇使用哪一行。

match(df1$name, df2$name) 
[1] 1 2 3 1 3 
2

如果你可以使用dplyr

library(dplyr) 
df %>% 
    mutate(s=sum(abundance)) %>% 
    group_by(name) %>% 
    mutate(relative_ab=sum(abundance)/s, s=NULL) 

    name abundance relative_ab 
    <fctr>  <int>  <dbl> 
1 joe   1   0.4 
2 tim   1   0.2 
3 bob   1   0.4 
4 joe   1   0.4 
5 bob   1   0.4 
0

我們可以通過name與基礎R爲此ave分組,並通過完整的abundance劃分組abundancesum

df$relative_ab <- with(df,ave(abundance, name, FUN = function(x) 
             sum(x)/sum(abundance))) 
df 
# name abundance relative_ab 
#1 joe   1   0.4 
#2 tim   1   0.2 
#3 bob   1   0.4 
#4 joe   1   0.4 
#5 bob   1   0.4 
0

我們可以(通過= 「名稱」 DF1,DF2)與data.table

library(data.table) 
setDT(df)[, relative_ab := sum(abundance)/sum(df$abundance) , name] 
df 
# name abundance relative_ab 
#1: joe   1   0.4 
#2: tim   1   0.2 
#3: bob   1   0.4 
#4: joe   1   0.4 
#5: bob   1   0.4 
相關問題