在一个合并过程之后,我得到了一个数据框架,看起来如下:
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有两次运输(id=3)。
在这个时刻,对于一次超过1次的旅行,我知道每个年龄组中的个体数量除以在特定旅行中出现的牵引数。例如,在trip 422中,我总共有15个人,但由于有2条运输,这个数字除以2,导致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这基本上是三种计算的规则,例如,对于trip 422 (2次运输),我将进行以下计算:
haul1: 12*(7.5 + 7.5)/(12 + 2) = 13个人haul2: 2*(7.5 + 7.5)/(12 + 2) =2个人
有一种简单的方法来计算这些计算吗?任何帮助都将不胜感激。
-M
发布于 2017-10-23 14:23:34
您可以使用dplyr来帮助解决这个问题。
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不确定您使用了什么舍入规则来获取人的整数计数,但是在更复杂的情况下,可能会遇到一些部分没有加起来的问题。
发布于 2017-10-23 14:24:38
另一种使用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如果你愿意,你可以用round():age_2 := round(catch_kg * sum(age_2) / sum(catch_kg))绕过round():age_2 := round(catch_kg * sum(age_2) / sum(catch_kg))
https://stackoverflow.com/questions/46891551
复制相似问题