r-使用ddply表示变量

时间:2014-11-02 04:49:37

标签: r loops plyr

我有一个表(t02f),其中包含一个字符变量(" t02.clase")和数字变量。我需要创建另一个表,其中包含t02.clase列中每个值的每个变量的平均值。

示例表:

t02.clase Std_A_CLI_monto_sucursal_1 Std_A_CLI_monto_sucursal_2 Std_A_CLI_monto_sucursal_3
1        AK                          0                 0.00000000                0.051311597
2        AK                          0                 0.01303586                0.003442244
3        AK                          0                 0.00000000                0.017347593
  Std_A_CLI_monto_sucursal_4 Std_A_CLI_promociones Std_A_CLI_dias_cliente Std_A_CLI_sucursales
1                          0             0.4736842             0.57061341           0.05555556
2                          0             0.5000000             0.55492154           0.05555556
3                          0             0.0000000             0.05991441           0.05555556
  Std_A_CLI_promos_enviadas Std_A_CLI_promos_compras Std_A_CLI_produni Std_A_CLI_flagret
1                 0.6363636                0.2727273        0.14749987                 0
2                 0.6363636                0.1818182        0.05973218                 1

我最终需要像:

t02.clase   Std_A_CLI_monto_sucursal_1  Std_A_CLI_monto_sucursal_2  Std_A_CLI_monto_sucursal_3
AK               0.3                                0.001                       0.2
AM               0.2                                0.02                        0.3
ES               0.5                                0.001                       0.0001

我用过:

a1<-data.frame(NULL)
a<-data.frame(NULL)
for (i in (colnames(t02f)[-1])) {a1<-ddply(t02f, .(t02.clase), summarize, mean(i))      
                          a<-cbind(a1,a) }

但是我得到了从1到ncol(t02f)的数字,这些数字来自。

2 个答案:

答案 0 :(得分:3)

或使用data.table

library(data.table)
setDT(t02f)[, lapply(.SD, mean, na.rm = TRUE), by = t02.clase]
#    t02.clase Std_A_CLI_monto_sucursal_1 Std_A_CLI_monto_sucursal_2 Std_A_CLI_monto_sucursal_3 Std_A_CLI_monto_sucursal_4 Std_A_CLI_promociones Std_A_CLI_dias_cliente
# 1:        AK                          0                0.004345287                 0.02403381                          0             0.3245614              0.3951498
#    Std_A_CLI_sucursales
# 1:           0.05555556

坦率地说,您可以使用基本R bycolMeans组合非常有效地完成此操作,例如(如果已将数据集转换为data.table类,则不要运行它)< / p>

do.call(rbind, by(t02f[, -1], t02f$t02.clase, colMeans,  na.rm = TRUE))
#    Std_A_CLI_monto_sucursal_1 Std_A_CLI_monto_sucursal_2 Std_A_CLI_monto_sucursal_3 Std_A_CLI_monto_sucursal_4 Std_A_CLI_promociones Std_A_CLI_dias_cliente
# AK                          0                0.004345287                 0.02403381                          0             0.3245614              0.3951498
#    Std_A_CLI_sucursales
# AK           0.05555556

或(只是为了好玩)

vapply(t02f[, -1], function(x) tapply(x,  t02f$t02.clase, mean, rm = TRUE), double(1))

答案 1 :(得分:1)

summarise_each

尝试dplyr
library(dplyr)
res <- t02f %>%
            group_by(t02.clase)%>%
            summarise_each(funs(mean=mean(., na.rm=TRUE)))  


as.data.frame(res)
#  t02.clase Std_A_CLI_monto_sucursal_1 Std_A_CLI_monto_sucursal_2
#1        AK                          0                0.004345287
#   Std_A_CLI_monto_sucursal_3 Std_A_CLI_monto_sucursal_4 Std_A_CLI_promociones
#1                 0.02403381                          0             0.3245614
#  Std_A_CLI_dias_cliente Std_A_CLI_sucursales
#1              0.3951498           0.05555556

如果您想使用ddply,则可以选择colwise

 library(plyr)
 ddply(t02f, .(t02.clase), numcolwise(mean, na.rm=TRUE))
 #  t02.clase Std_A_CLI_monto_sucursal_1 Std_A_CLI_monto_sucursal_2
 #1        AK                          0                0.004345287
 #  Std_A_CLI_monto_sucursal_3 Std_A_CLI_monto_sucursal_4 Std_A_CLI_promociones
 #1                 0.02403381                          0             0.3245614
 #  Std_A_CLI_dias_cliente Std_A_CLI_sucursales
 #1              0.3951498           0.05555556

或使用aggregate

中的base R
 aggregate(.~t02.clase, t02f, mean, na.rm=TRUE)

数据

t02f <- structure(list(t02.clase = c("AK", "AK", "AK"),
 Std_A_CLI_monto_sucursal_1 = c(0L,0L, 0L), Std_A_CLI_monto_sucursal_2 = 
 c(0, 0.01303586, 0), Std_A_CLI_monto_sucursal_3 = c(0.051311597, 
 0.003442244, 0.017347593), Std_A_CLI_monto_sucursal_4 = c(0L, 
 0L, 0L), Std_A_CLI_promociones = c(0.4736842, 0.5, 0), Std_A_CLI_dias_cliente =
 c(0.57061341,0.55492154, 0.05991441), Std_A_CLI_sucursales = c(0.05555556, 
 0.05555556, 0.05555556)), .Names = c("t02.clase", "Std_A_CLI_monto_sucursal_1", 
 "Std_A_CLI_monto_sucursal_2", "Std_A_CLI_monto_sucursal_3",
"Std_A_CLI_monto_sucursal_4","Std_A_CLI_promociones", "Std_A_CLI_dias_cliente",
"Std_A_CLI_sucursales"), row.names = c("1", "2", "3"), class = "data.frame")