具有R中的功能的表

时间:2014-07-25 09:16:56

标签: r xtable

我需要对数据集做一些描述性统计。 我需要从数据集中创建一个表,为每个级别提供另一个变量的平均值。

city   mean(age) 
 1       14    
 2       15    
 3       23    
 4       34    

哪种方式在R中最快?

我要做的另一件事情是同样的事情,但在两个方面:

mean(age)   male   female 
 city      
 1          12       13     
 2          15       16
 3          21       22
 4          34       33

我想知道是否还可以应用其他功能,如max,min,sum ....

编辑:我添加数据集以更轻松地创建示例:

data.frame(years=rep(c(12,13,14,15,15,16,34,67,45,78,17,42),2),sex=rep(c("M","F"),12),city=rep(c(1,2,3,4,4,3,2,1),3))  

2 个答案:

答案 0 :(得分:2)

可以尝试(在大数据集上添加data.table包以加快dcast

library(data.table)
library(reshape2)
dcast.data.table(setDT(dato), city ~ sex, value.var = "years", fun = mean)

#    city        F        M
# 1:    1 41.33333 24.00000
# 2:    2 35.66667 21.66667
# 3:    3 35.66667 21.66667
# 4:    4 41.33333 24.00000

您也可以定期使用data.table

dato <- setkey(setDT(dato)[, list(mean = mean(years)), by = list(city, sex)])

#    city sex     mean
# 1:    1   F 41.33333
# 2:    1   M 24.00000
# 3:    2   F 35.66667
# 4:    2   M 21.66667
# 5:    3   F 35.66667
# 6:    3   M 21.66667
# 7:    4   F 41.33333
# 8:    4   M 24.00000

dplyr包(也非常快)

library(dplyr)
dato %>%
  group_by(city, sex) %>%
      summarize(mean(years))

#   city sex mean(years)
# 1    1   F    41.33333
# 2    1   M    24.00000
# 3    2   F    35.66667
# 4    2   M    21.66667
# 5    3   F    35.66667
# 6    3   M    21.66667
# 7    4   F    41.33333
# 8    4   M    24.00000

答案 1 :(得分:1)

由于您还询问了如何将大量函数应用于一列或多列:您可以使用dplyr轻松完成此操作:

library(dplyr)

dato %>%
  group_by(city, sex) %>%
  summarise_each(funs(mean, min, max, sum))

#Source: local data frame [8 x 6]
#Groups: city
#
#  city sex     mean min max sum
#1    1   F 41.33333  15  67 124
#2    1   M 24.00000  12  45  72
#3    2   F 35.66667  13  78 107
#4    2   M 21.66667  14  34  65
#5    3   F 35.66667  13  78 107
#6    3   M 21.66667  14  34  65
#7    4   F 41.33333  15  67 124
#8    4   M 24.00000  12  45  72

默认情况下,这会将定义的函数应用于除分组变量(城市,性别)之外的所有列。由于您只有三列,因此这些功能仅应用于年龄列。您还可以通过将summarise_each更改为

来指定要将功能应用于哪个列或要从中排除哪些列?
summarise_each(funs(mean, min, max, sum), c(col1, col2))  # include only col1 and col2
summarise_each(funs(mean, min, max, sum), -c(col2, col3)) # exclude col2 and col3