2017-10-23 15 views
2

に共通の識別子および特定の列に基づいて値を行分割、私は次のようになり、データフレームを得た:は比例マージ処理後のデータフレーム

df <- data.frame(trip=c(315,328,422,422,458,652,652,652,699), 
       catch_kg=c(10,8,12,2,26,4,18,14,11), 
       age_1=c(0,0,0,0,0,0,0,0,0), 
       age_2=c(2,1,7.5,7.5,8,11,11,11,13), 
       id=c(1,2,3,3,4,5,5,5,6)) 

trip catch_kg age_1 age_2 id 
315  10  0  2  1 
328  8  0  1  2 
422  12  0  7.5  3 
422  2  0  7.5  3 
458  26  0  8  4 
652  4  0  11  5 
652  18  0  11  5 
652  14  0  11  5 
699  11  0  13  6 

ここで釣り旅行を表す旅行、catch_kg(キロ)で釣った魚の量、age_1 & age_2は、各旅行中や年齢層ごとの個体数で、IDは、各旅行で長距離のアイデンティティを表します。

いくつかの釣り旅行では、私は1つ以上の運行を持っています - id欄でアクセスできます。ここでは、1つ以上の運行を伴う旅行には同じID番号が割り当てられます。例えば、トリップ番号422には2つの牽引力(id = 3)があります。

この時点では、1つ以上の運行を伴う旅行では、各年齢グループ内の個体数が、その特定の旅行内に現れる個体数で等しく分割されています。たとえば、旅行422では合計15人の人がいますが、2人のハルスがいるので、この数を2で割って、1人あたり7.5人になります。

しかし、私が望むのは、各年齢グループ内の個体数を、各運搬グループ内の総漁獲量の割合として計算することです。 したがって、私は次のように見えるデータフレームを持っていると思い終わりに:

trip catch_kg age_1 age_2 id 
315  10  0  2 1 
328  8  0  1 2 
422  12  0  13 3 
422  2  0  2 3 
458  26  0  8 4 
652  4  0  4 5 
652  18  0  16 5 
652  14  0  13 5 
699  11  0  13 6 

これは、基本的に旅行422(2つの曳)のために、例えば、私が持っているであろう3つの計算のルールであります以下の計算:

haul1:12 *(7.5 + 7.5)/(12 + 2)= 13個体 haul2:2 *(7.5 + 7.5)/(12 + 2)= 2個体

はありますこれらの計算を簡単に計算する方法は? ご協力いただければ幸いです。

-M

答えて

0

別の解決策は、data.table使用して:あなたは丸めることができますしたい場合は

library(data.table) 
setDT(df) 
df[, age_2 := catch_kg * sum(age_2)/sum(catch_kg), trip] 
# trip catch_kg age_1  age_2 id 
#1: 315  10  0 2.000000 1 
#2: 328  8  0 1.000000 2 
#3: 422  12  0 12.857143 3 
#4: 422  2  0 2.142857 3 
#5: 458  26  0 8.000000 4 
#6: 652  4  0 3.666667 5 
#7: 652  18  0 16.500000 5 
#8: 652  14  0 12.833333 5 
#9: 699  11  0 13.000000 6 

age_2round()と:age_2 := round(catch_kg * sum(age_2)/sum(catch_kg))

1

あなたはおそらくトラブルに実行したいまさにあなたが人々の数を整数に取得するために使用していた規則を丸めますが、わからないこの

library(dplyr) 
df %>% group_by(trip) %>% 
    mutate(age_2=catch_kg/sum(catch_kg)*sum(age_2)) 
# trip catch_kg age_1  age_2 id 
# <dbl> <dbl> <dbl>  <dbl> <dbl> 
# 1 315  10  0 2.000000  1 
# 2 328  8  0 1.000000  2 
# 3 422  12  0 12.857143  3 
# 4 422  2  0 2.142857  3 
# 5 458  26  0 8.000000  4 
# 6 652  4  0 3.666667  5 
# 7 652  18  0 16.500000  5 
# 8 652  14  0 12.833333  5 
# 9 699  11  0 13.000000  6 

を支援するためにdplyrを使用することができますより複雑なシナリオでは、部品が完全に統合されません。