在r中一次使用多个列上的聚合函数

时间:2018-06-15 18:43:12

标签: r

假设我有一个包含多行和多列的数据集,我想记录每列的最小值,最大值和平均值,并将这些数据存储在自己的表中。如何以能够为每列找到此数据的方式遍历数据框?

编辑:我的初始数据存储在一个类似于Initial Data的tbl中,我希望输出看起来像这样Output Data

2 个答案:

答案 0 :(得分:0)

查看包dplyr,这将使这项任务更加简单!

这是一种仅使用dplyr的方法。格式并不完全是输出数据中的内容......

> df <- data.frame(A=c(7,2,4), B=c(5,4,6), C=c(7,9,1))  # Your Initial Data

> library(dplyr)

> df %>% summarise_all(.funs=funs(mean, min, max))  ## Approach 1: just dplyr

      A_mean B_mean   C_mean A_min B_min C_min A_max B_max C_max
  1 4.333333      5 5.666667     2     4     1     7     6     9

或者,如果您还使用包tidyr,则可以获得输出数据所需的格式:

> library(tidyr)
> df %>% 
+    gather(Column, Value) %>%  ## Converts dataframe from wide to long format
+    group_by(Column) %>%       ## Groups by the new column containing old column names
+    summarise(Max=max(Value), Min=min(Value), Mean=mean(Value))  ## The summary functions

# A tibble: 3 x 4
  Column   Max   Min  Mean
  <chr>  <dbl> <dbl> <dbl>
1 A       7.00  2.00  4.33
2 B       6.00  4.00  5.00
3 C       9.00  1.00  5.67

使用这些软件包的一个优点是,与df相比,使用显式循环可能更有效。

答案 1 :(得分:0)

我建议你使用长桌而不是宽桌。虽然最后一个会使人眼更简单,但前者更易于操作以进行数据分析。也就是说,我认为您可以使用data.table包来实现这一目标:

# create a data frame
df <- data.frame(A=c(7,2,4), B=c(5,4,6), C=c(7,9,1))

# load data.table package
require(data.table)

# convert df to a data.table
setDT(df)

#Explanation of the following code:
#    melt: turns your wide table into a long one
#    .(val_mean ...) calculate and give names to calculated variables
#    by = ... : group by variable. See data.table vignette

melt(df)[, .(val_mean = mean(value), 
             val_min = min(value), 
             val_max = max(value)), 
        by = variable]

产生:

   variable val_mean val_min val_max
1:        A 4.333333       2       7
2:        B 5.000000       4       6
3:        C 5.666667       1       9