我有一个包含3列描述帐户的数据框:
年龄,用户和费用
“年龄”列的范围为1-20,我想要做的是按年龄计算平均成本,并按平均用户除以年龄。
例如,1岁以上的平均用户数是多少,1岁的平均帐户成本是多少。
数据框很大,我不想只输入df = data [data $ age_month == 1,],然后将方法应用于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和所有年龄
提前致谢,
答案 0 :(得分: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
答案 1 :(得分:0)
这是使用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
答案 2 :(得分:0)
以下是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
答案 3 :(得分:0)
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
答案 4 :(得分:0)
由于没有人提及它,您也可以使用基础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
一次对所有子数据框执行操作(此处计算您可以简单使用的平均值{{ 1}})。然后colMeans
获取结果列表并将其转回数据框。
获得每位用户成本的最后一步与其他解决方案相同。