2014-07-07 39 views
0

我有3列描述账户数据帧:如何按特定列值拆分数据框,然后将函数应用于数据集中的列?

时代,用户,和成本

年龄列1-20的范围和我想要做的是年龄,并计算平均成本按年龄划分平均用户。

因此,例如,什么是谁都是年龄1和用户的平均数量是什么帐户年龄的平均成本1

数据帧是巨大的,我不喜欢只需键入DF =数据[数据$ 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分割用户列,其中年龄= 1的由平均数的平均数对于所有年龄段

在此先感谢,

+2

请发布一些信息。 – Fernando

+0

你应该添加一个可重复的例子http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – ECII

回答

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 
+0

nvm忽视以前的评论 – user136482

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 
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 
+0

刚刚看到你的'dplyr'代码。我删除了我创建的那个。 – akrun

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 
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一次对所有子数据帧执行操作(这里计算平均值你可以简单地使用colMeans)。然后do.call(rbind,...)将您的结果列表重新转换为数据框。

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

相关问题