难以对变量进行分组并将功能应用于组

时间:2015-10-12 01:01:35

标签: r grouping tapply

我需要将我的数据分组为2或3个选择级别,并对每个特定组应用一个函数。当我使用标准函数(均值,中位数,SD)时,命令tapply会执行此操作,但是当我插入多个过滤器变量时,它不起作用。

代码:

  tipo      <-  rep(LETTERS[1:3], 9)
  vendedor  <-  rep(LETTERS[11:13], 9)        
  produto   <-  rep(LETTERS[17:19],9)
  valor     <-  trunc(rnorm(27,1000,50)) 
  dados     <-  data.frame(tipo, vendedor, produto, valor)
  funcao    <-  function(dados) c(media = mean(valor), 
                                 desvio = sd(valor)*0.23)
  simplify2array(tapply(dados$valor, dados$tipo, funcao))
  simplify2array(tapply(dados$valor, list(dados$tipo, dados$vendedor), funcao))

命令tapply 1的输出,工作正常:

> simplify2array(tapply(dados$valor, dados$tipo, funcao))
            A          B          C
media  998.370370 998.370370 998.370370
desvio   9.763732   9.763732   9.763732

tapply 2命令的输出,它无法正常工作:

> simplify2array(tapply(dados$valor, list(dados$tipo, dados$vendedor), funcao))
  K         L         M        
A Numeric,2 NULL      NULL     
B NULL      Numeric,2 NULL     
C NULL      NULL      Numeric,2

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

据我了解,您有一个函数funcao,它返回2个元素(mediadesvio),并且您希望在每个tipo / {中应用它{1}}使用vendedor进行配对。你可以这样做:

tapply

基本上我所做的就是将分组变量从funcao <- function(valor) c(media = mean(valor), desvio = sd(valor)*0.23) simplify2array(tapply(dados$valor, paste(dados$tipo, dados$vendedor), funcao)) # A K B L C M # media 967.11111 989.11111 1001.55556 # desvio 12.55158 12.63768 11.27241 更改为list(dados$tipo, dados$vendedor),这只是将paste(dados$tipo, dados$vendedor)tipo变量粘贴在一起。感谢@ thelatemail的评论,我还更新了vendedor以使用其论点。