【问题标题】:How to use "with" and "tapply" to calculate a new variable based on multiple factors如何使用“with”和“tapply”来计算基于多个因素的新变量
【发布时间】:2014-05-07 17:48:56
【问题描述】:

我正在尝试根据另一个变量“Period”获取单个组“Actrl”的电话处理时间“Handle”的平均值“ctrlmeans”。然后,我想通过从数据框中每个人的“句柄”中减去该平均值来创建一个新变量“差异”。

这就是我所做的:

> ttp1<-read.csv("ttp1.csv")

> dput(head(ttp1,12))

structure(list(NUID = structure(c(4L, 6L, 7L, 8L, 11L, 12L, 9L, 
10L, 1L, 2L, 3L, 5L), .Label = c("A000904", "A024324", "A047744", 
"A063828", "A071164", "C833344", "C833345", "C833346", "E254607", 
"Y950092", "Z952754", "Z993876"), class = "factor"), Period = c(201415L, 
201415L, 201415L, 201415L, 201415L, 201415L, 201416L, 201416L, 
201416L, 201416L, 201416L, 201416L), Queue = c(1L, 2L, 1L, 1L, 
2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L), Group = structure(c(2L, 4L, 
3L, 3L, 3L, 3L, 1L, 4L, 3L, 3L, 3L, 3L), .Label = c("A", "A ", 
"ACTRL", "B"), class = "factor"), Handle = c(1013L, 699L, 425L, 
450L, 444L, 681L, 532L, 716L, 388L, 307L, 430L, 380L)), .Names = c("NUID", 
"Period", "Queue", "Group", "Handle"), row.names = c(NA, 12L), class = "data.frame")

我的命令:

> ctrlmeans <- with(subset(ttp1, Group=="ACTRL"), tapply(Handle, Period, mean))

> ctrlmeans


201415 201416 
500.00 376.25 

> Difference <- ttp1$Handle-ctrlmeans[ttp1$Period]

> Difference


<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 
  NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA 

为什么我会得到 NA?

如果我在 tapply 命令“队列”中包含一个额外的分组变量,我会怎么做?

【问题讨论】:

    标签: r with-statement tapply


    【解决方案1】:

    如果您想按PeriodQueue 的组计算Handle 的均值,举个例子说明这将如何与dplyr 包一起工作:

    require(dplyr)
    
    ctrlmeans <-                               #data.frame to store your results   
    ttp1 %.%                                   #data.frane to use for analysis
      group_by(Period,Queue) %.%               #grouping variables (you can add/remove Queue if you like)
      filter(Group == "ACTRL") %.%             #use only rows where Group == "ACTRL"
      summarize(mean.Handle = mean(Handle))    #makes a summary column with means of Handle by group                                                                                     
    
    ttp1 <- inner_join(ttp1,ctrlmeans,by=c("Period","Queue"))  #join the ctrlmeans to the ttp1 data frame
    ttp1["Diff"] <- with(ttp1, Handle - mean.Handle)           #Add column for the differences
    
    #>ttp1
    #      NUID Period Queue Group Handle mean.Handle   Diff
    #1  A063828 201415     1    A    1013       437.5  575.5
    #2  C833345 201415     1 ACTRL    425       437.5  -12.5
    #3  C833346 201415     1 ACTRL    450       437.5   12.5
    #4  C833344 201415     2     B    699       562.5  136.5
    #5  Z952754 201415     2 ACTRL    444       562.5 -118.5
    #6  Z993876 201415     2 ACTRL    681       562.5  118.5
    #7  E254607 201416     1     A    532       347.5  184.5
    #8  A000904 201416     1 ACTRL    388       347.5   40.5
    #9  A024324 201416     1 ACTRL    307       347.5  -40.5
    #10 Y950092 201416     2     B    716       405.0  311.0
    #11 A047744 201416     2 ACTRL    430       405.0   25.0
    #12 A071164 201416     2 ACTRL    380       405.0  -25.0 
    

    如果您只想按周期组计算,只需从 filter 语句和 inner_join 语句中删除 Queue

    【讨论】:

      【解决方案2】:

      此方法仅在 Period 是字符或因子时才有效。现在它是数字,所以你可以改变

      Difference <- ttp1$Handle-ctrlmeans[as.character(ttp1$Period)]
      

      此外,此方法仅适用于一个分组变量。如果不止一个,您可能希望对新数据集执行一些聚合以获取组摘要,然后将其合并回更大的 data.frame 并进行所需的任何转换。或者您可以查看更高级的 data.frame 操作包,例如 plyr。但这确实是一个不同的问题/问题。

      【讨论】:

      • 完美,我在导入之前连接了两个分类变量,上面的命令完美运行。非常感谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      相关资源
      最近更新 更多