2016-05-06 16 views
1

私は行ラベルまたは名前に基づいて相対的な存在量を計算しようとしています(df$path1で各テストの相対的な豊富さを得ようとしていますので、カウントの相対的な量をtest1から計算し、 。。Rの相対ラベルを行ラベルで計算します。 (ビーガンパッケージ?)

library(vegan) 
df <- data.frame(x = c("a", "b", "c", "d", "e"), 
       path1 = c("test1", "test1", "test2", "test2", "test3"), 
       value = c(40, 10, 34, 12, 20)) 
df$relabun <- decostand(df[3], 2, method = "total") #takes relative abundace of whole column 
test2からのカウントの豊富別途 test1からの相対的存在量数の和は、私は現在、 veganパッケージを使用して、他のオプションに開いてい

テストデータセットを1

に等しくなります に基づく相対的な存在量のため

理想的な出力は、次のようになります。

x path1 relabun_bypath1 
a test1 0.8 
b test1 0.2 
c test2 0.74 
d test2 0.26 
e test3 1 

答えて

1

これは古典的な分割適用コンバイン質問です。基地Rにおける最もリテラル方法は*applyで関数を適用

  • splitとグループによってdata.frameを分割し、
  • であり、そして
  • do.call(rbind, ...)
  • 又はunlistと組み合わせます。我々は新しい変数に割り当てることができます

ので

unlist(lapply(split(df, df$path1), function(x){x$value/sum(x$value)})) 
# test11 test12 test21 test22  test3 
# 0.8000000 0.2000000 0.7391304 0.2608696 1.0000000 

。しかし、ベースは私たちのためにグループ全体で関数を適用することができますaveと呼ばれる素敵な奇妙な名前の場合は機能を持っています

ave(df$value, df$path1, FUN = function(x){x/sum(x)}) 
# [1] 0.8000000 0.2000000 0.7391304 0.2608696 1.0000000 

より簡潔良い取引で、同様に新しい変数に割り当てることができました。

あなたがHadleyverseを好む場合は、dplyrのグループ化は、プロセスをより読みやすくすることができます。

library(dplyr) 
df %>% group_by(path1) %>% mutate(relAbundByPath = value/sum(value)) 
# Source: local data frame [5 x 4] 
# Groups: path1 [3] 
# 
#  x path1 value relAbundByPath 
# (fctr) (fctr) (dbl)   (dbl) 
# 1  a test1 40  0.8000000 
# 2  b test1 10  0.2000000 
# 3  c test2 34  0.7391304 
# 4  d test2 12  0.2608696 
# 5  e test3 20  1.0000000 

あなたが見ることができるように、それは我々が上書きするために使用できるdata.frameの新しいバージョンを返します既存のコピーを作成するか、新しいコピーを作成します。

あなたが選んだルートはどちらかというと、ロジックに慣れてくださいより良い、それらのすべてを学ぶ。そしてtapplyおよびmapply/Map。そしてdata.table ...どうして?


注:あなたが好きな場合にもprop.table機能をvalue/sum(value))構造を置き換えることができます。それはより簡潔です(例えばave(df$value, df$path1, FUN = prop.table))が、それが何をしているのかがはっきりしないので、私はここでそれを使用しませんでした。

関連する問題