【问题标题】:using tapply in multiple variables在多个变量中使用 tapply
【发布时间】:2014-12-10 17:56:42
【问题描述】:

我有一组数据,其中包含有关客户的信息以及他们花了多少钱,每个客户只出现一次:

customer<-c("Andy","Bobby","Oscar","Oliver","Jane","Cathy","Emma","Chris")
age<-c(25,34,20,35,23,35,34,22)
gender<-c("male","male","male","male","female","female","female","female")
moneyspent<-c(100,100,200,200,400,400,500,200)

data<-data.frame(customer=customer,age=age,gender=gender,moneyspent=moneyspent)

如果我想计算男性和女性客户平均花费的金额,我可以使用tapply:

tapply(moneyspent,gender,mean)

给出:

female   male 
  375    150

但是,我现在想找出性别和年龄组的平均花费,我的目标是:

 Male Age 20-30      Female Age 20-30      Male Age 30-40      Female Age 30-40
    150                     300                 150                   450

我怎样才能修改 tapply 代码以便它给出这些结果?

谢谢你

【问题讨论】:

    标签: r tapply


    【解决方案1】:

    您可能需要使用cut

    mat <- tapply(moneyspent, list(gender, age=cut(age, breaks=c(20,30,40), 
                    include.lowest=TRUE)), mean)
    
    nm1 <- outer(rownames(mat), colnames(mat), FUN=paste)
    setNames(c(mat), nm1)
    #female [20,30]   male [20,30] female (30,40]   male (30,40] 
    #       300            150            450            150 
    

    其他选项包括

    library(dplyr)
    data %>% 
         group_by(gender, age=cut(age, breaks=c(20,30,40), 
                  include.lowest=TRUE)) %>% 
         summarise(moneyspent=mean(moneyspent))
    

    或者

     library(data.table)
     setDT(data)[, list(moneyspent=mean(moneyspent)),
         by=list(gender, age=cut(age, breaks= c(20,30,40), include.lowest=TRUE))]
    

    【讨论】:

      【解决方案2】:

      使用 plyr 包

      library(plyr)
      
      ddply(data,.(gender, age=cut(age, breaks=c(20,30,40), 
                        include.lowest=TRUE)), summarize, moneyspent=mean(moneyspent))
      

      也会给出同样的结果。

      注意:Summarize 和Summarise 执行相同的功能。

      警告: 加载 plyr 掩盖了 dplyr 的摘要!你需要detachplyr才能再次使用Summarize等函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-02
        • 2023-02-18
        • 1970-01-01
        • 2020-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多