[英]How do I split a data frame by a specific column value, and then apply functions to columns within the data set?
我有一个包含3列描述帐户的数据框:
年龄,使用者和费用
“年龄”列的范围是1到20,我想做的是按年龄计算平均费用,然后按年龄划分“平均用户数”。
因此,例如,年龄均为1的平均用户数是多少,年龄为1的平均帐户成本是多少。
数据框很大,我不希望仅输入df = data [data $ age_month == 1],然后将均值乘以1到列。
Age Users Cost
1 2 5
2 15 7
2 124 10
2 43 100
3 232 21212
4 234 21212
4 12 10000
4 10 3
5 11 89
6 4 11
6 8 12
6 10 15
因此,我希望将“年龄= 1”的“均值成本”列除以“年龄= 1”以及所有年龄段的“用户均值”列
提前致谢,
尝试:
CostbyAge <- with(dat, ave(Cost, Age, FUN=mean) )
UsersbyAge <- with(dat, ave(Users, Age, FUN=mean))
CostbyAge/UsersbyAge
# [1] 2.5000000 0.6428571 0.6428571 0.6428571 91.4310345 121.9335938
# [7] 121.9335938 121.9335938 8.0909091 1.7272727 1.7272727 1.7272727
这是使用doBy::summaryBy
。 假设dat
是您的样本数据
> library(doBy)
> ( s <- summaryBy(Users+Cost~Age, data = dat) )
# Age Users.mean Cost.mean
# 1 1 2.000000 5.00000
# 2 2 60.666667 39.00000
# 3 3 232.000000 21212.00000
# 4 4 85.333333 10405.00000
# 5 5 11.000000 89.00000
# 6 6 7.333333 12.66667
> s$Cost.mean / s$Users.mean
# [1] 2.5000000 0.6428571 91.4310345 121.9335938 8.0909091 1.7272727
这是使用dplyr
的一种方法:
library(dplyr)
dat %>%
group_by(Age) %>%
summarize(count=length(Age),
users_mean=round(mean(Users),2),
cost_mean=round(mean(Cost),2),
cost_per_user=round(cost_mean/users_mean,2))
Age count users_mean cost_mean cost_per_user
1 1 1 2.00 5.00 2.50
2 2 3 60.67 39.00 0.64
3 3 1 232.00 21212.00 91.43
4 4 3 85.33 10405.00 121.94
5 5 1 11.00 89.00 8.09
6 6 3 7.33 12.67 1.73
data.table
解决方案
library(data.table)
setDT(dat)[, list(User_mean = mean(Users),
Mean_Cost = mean(Cost),
Cost_per_User = mean(Cost)/mean(Users)), by = Age]
基本R,使用aggregate
aggdat <- aggregate(cbind(Users, Cost) ~ Age, dat, mean)
aggdat$Cost_per_User <- aggdat$Cost/aggdat$Users
由于没有人提及,因此您还可以将base R split
与lapply
结合使用:
> lapply(split(dat,dat$Age),colMeans)
要将结果输出为数据框而不是列表,将需要以下附加步骤:
> do.call(rbind,lapply(split(dat,dat$Age),colMeans))
Age Users Cost
1 1 2.000000 5.00000
2 2 60.666667 39.00000
3 3 232.000000 21212.00000
4 4 85.333333 10405.00000
5 5 11.000000 89.00000
6 6 7.333333 12.66667
split
取数据框并创建一个相应的数据lapply
列表,然后通过lapply
对所有子数据lapply
进行操作(此处计算平均值,您可以简单地使用colMeans
)。 然后do.call(rbind,...)
获取结果列表,并将其返回到数据框。
获得每位用户成本的最后一步与其他解决方案相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.