[英]R - select and assign value to group based on condition in column
具有如下所示的数据框:
d
year pos days sal
1 2009 A 31 2000
2 2009 B 60 4000
3 2009 C 10 600
4 2010 B 10 1000
5 2010 D 90 7000
我想按year
对数据进行分组,添加days
和sal
,然后选择pos
,其中组中的days
数最多。
结果应为:
year pos days sal
1 2009 B 101 6600
2 2010 D 100 8000
我可以处理的数值,如days
和sal
使用功能,如tapply(d$days, d$year, sum)
。
但是,我不知道如何选择满足条件的pos并将其分配给组。
任何意见将不胜感激!
我们可以使用dplyr
。 按“年”分组后,获得“天数”最大的“位置”( which.max(days)
),以及“天数”和“ sal”的sum
。
library(dplyr)
d %>%
group_by(year) %>%
summarise(pos = pos[which.max(days)], days = sum(days), sal = sum(sal))
# # A tibble: 2 × 4
# year pos days sal
# <int> <chr> <int> <int>
#1 2009 B 101 6600
#2 2010 D 100 8000
以R为底的解决方案:
m1 <- d[as.logical(with(d, ave(days, year, FUN = function(x) seq_along(x) == which.max(x)) )), c('year','pos')]
m2 <- aggregate(cbind(days, sal) ~ year, d, sum)
merge(m1, m2, by = 'year')
或与data.table包一起使用:
library(data.table)
setDT(d)[order(days), .(pos = pos[.N], days = sum(days), sal = sum(sal)), by = year]
产生的data.frame / data.table:
year pos days sal
1 2009 B 101 6600
2 2010 D 100 8000
使用sqldf:
library(sqldf)
cbind.data.frame(sqldf('select year, sum(days) as days, sum(sal) as sal
from d group by year'),
sqldf('select pos from d group by year having days=max(days)'))
year days sal pos
1 2009 101 6600 B
2 2010 100 8000 D
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.