r - 使用管道中的标识符列创建一个具有最大值的新列
问题描述
我正在尝试清理一些旧代码并转换为“整洁”。我正在尝试在管道中创建一个新的数据列,这是单个鱼的最大年龄。让我们将感兴趣的列表示为:
fish_1 <- data.frame(year = c(2012,2012,2015,2015,2015,2013,2013,2013,2013,2012,2012,2015,2015,2015),
fishid = c('a','a','b','b','b','c','c','c','c','d','d','e','e','e'), # unique identifier for each fish
agei = c(1,2,1,2,3,1,2,3,4,1,2,1,2,3))
# which looks like this:
fish_1
year fishid agei
1 2012 a 1
2 2012 a 2
3 2015 b 1
4 2015 b 2
5 2015 b 3
6 2013 c 1
7 2013 c 2
8 2013 c 3
9 2013 c 4
10 2012 d 1
11 2012 d 2
12 2015 e 1
13 2015 e 2
14 2015 e 3
我要做的是创建一个新列,该列agec
是每条鱼重复的最大年龄,但是需要多次填充每条鱼的行。
所需的输出将是:
fish_2 <- data.frame(year = c(2012,2012,2015,2015,2015,2013,2013,2013,2013,2012,2012,2015,2015,2015),
fishid = c('a','a','b','b','b','c','c','c','c','d','d','e','e','e'), # unique identifier for each fish
agei = c(1,2,1,2,3,1,2,3,4,1,2,1,2,3),
agec = c(2,2,3,3,3,4,4,4,4,2,2,3,3,3))
# Which looks like:
fish_2
year fishid agei agec
1 2012 a 1 2
2 2012 a 2 2
3 2015 b 1 3
4 2015 b 2 3
5 2015 b 3 3
6 2013 c 1 4
7 2013 c 2 4
8 2013 c 3 4
9 2013 c 4 4
10 2012 d 1 2
11 2012 d 2 2
12 2015 e 1 3
13 2015 e 2 3
14 2015 e 3 3
我过去这样做的方法是使用plyr::ddply()
调用来创建一个新的数据框,然后像这样与鱼合并:
caps = plyr::ddply(fish_1, c('fishid'), plyr::summarize, agec=max(agei))
fish = merge(fish_1, caps, by='fishid')
fish
fishid year agei agec
1 a 2012 1 2
2 a 2012 2 2
3 b 2015 1 3
4 b 2015 2 3
5 b 2015 3 3
6 c 2013 1 4
7 c 2013 2 4
8 c 2013 3 4
9 c 2013 4 4
10 d 2012 1 2
11 d 2012 2 2
12 e 2015 1 3
13 e 2015 2 3
14 e 2015 3 3
我希望有人可以帮助我在管道中简洁地实现这种数据结构。我发现的所有类似问题都非常冗长,并不针对这个问题。我是使用 tidyverse 的新手,但我无法在管道中获取group_by()
函数(替换ddply()
调用),我希望有一种更简单的方法。
更新
对于那些感兴趣的人来说,下面的两个答案似乎都是正确的。我挣扎的原因是因为我已经在我的管道中完成了其他数据操作,并且我试图agec
在之前的调用中完成列的形成dplyr::mutate()
。您可以参考我对@Thomas 回答的评论,以我的方式查看错误。希望这可以帮助。
解决方案
尝试dplyr
代替plyr
library(dplyr)
fish_1 %>%
group_by(fishid) %>%
mutate(agec = max(agei))
推荐阅读
- android - POST 因 Retrofit 失败(连接超时),但可与 Postman 一起使用
- node.js - Vue.js:找不到模块
- reactjs - 如何调度从 API 获取的数据?
- html - HTML colspan 和 rowspan 问题
- c++ - 我有一个字符串变量 word="APA"
- r - 在 html 报告中可视化差异
- java - 工人完成后向执行者提交新任务
- c# - EF Core DbContext 为自定义数据模型创建表
- azure-devops - VSTS - 如何编写具有阶段的构建定义,这些阶段专注于他们自己的相同解决方案的专有项目?
- java - 访问 RecyclerView 中 OnBindViewHolder 内的所有持有者视图