难以对变量进行分组并将函数应用于组
Difficulty in grouping variables and apply function to groups
我需要将我的数据分组为 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
有谁知道我该如何解决这个问题?
据我了解,您有一个函数 funcao
,其中 returns 2 个元素(media
和 desvio
),并且您想将它应用于每个 tipo
/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
和 vendedor
变量粘贴在一起。感谢@thelatemail 的评论,我还更新了 funcao
以使用其参数。
我需要将我的数据分组为 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
有谁知道我该如何解决这个问题?
据我了解,您有一个函数 funcao
,其中 returns 2 个元素(media
和 desvio
),并且您想将它应用于每个 tipo
/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
和 vendedor
变量粘贴在一起。感谢@thelatemail 的评论,我还更新了 funcao
以使用其参数。