2017-06-07 3 views
1

私は私が仕事データフレームを得た方法をまとめます:別の列に対応する値を持つ列を追加する方法は?

 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で2つ目は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 
関連する問題