如何按特定列值拆分数据框,然后将函数应用于数据集中的列?

时间:2014-07-07 18:00:39

标签: r

我有一个包含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和所有年龄

提前致谢,

5 个答案:

答案 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 splitlapply结合使用:

> 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获取结果列表并将其转回数据框。

获得每位用户成本的最后一步与其他解决方案相同。