首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据数据帧中的公共标识符和特定列按比例划分行值

根据数据帧中的公共标识符和特定列按比例划分行值
EN

Stack Overflow用户
提问于 2017-10-23 14:14:23
回答 2查看 60关注 0票数 2

在一个合并过程之后,我得到了一个数据框架,看起来如下:

代码语言:javascript
运行
复制
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人/次。

然而,我想要计算的是,每一年龄组的个体数量在每一组捕获量中所占的比例。因此,最后,我希望有一个数据框架如下:

代码语言:javascript
运行
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-23 14:23:34

您可以使用dplyr来帮助解决这个问题。

代码语言:javascript
运行
复制
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

不确定您使用了什么舍入规则来获取人的整数计数,但是在更复杂的情况下,可能会遇到一些部分没有加起来的问题。

票数 2
EN

Stack Overflow用户

发布于 2017-10-23 14:24:38

另一种使用data.table的解决方案:

代码语言:javascript
运行
复制
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))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46891551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档