R dataframe中的统计函数(没有sqldf包)

时间:2017-05-30 22:16:12

标签: r

我在R中有一个包含如下值的数据框:

  Est     Act     Tgt   Name
   34      45      42    Tom
   36      36      37    Tom
   39      38      38    Tom
   31      40      38   John
   35      41      40   John

对于与Name列中每个不同值对应的值,我想收集一些基本的统计值,最终得到如下内容:

        Min   Max    Avg    Min   Max    Avg
Name    Est   Est    Est    Tgt   Tgt    Tgt
 Tom    -11     1  -3.33     -3     1  -0.66
John     -9    -6   -7.5     -2    -1   -1.5
  • Min.Est表示minimum(对于给定名称)的Est minus Act
  • Max.Est表示maximum(对于给定名称)的Est minus Act
  • Avg.Est表示average(对于给定名称)的Est minus Act

类似地:

  • Min.Tgt表示minimum(对于给定名称)的Tgt minus Act
  • Max.Tgt表示maximum(对于给定名称)的Tgt minus Act
  • Avg.Tgt表示average(对于给定名称)的Tgt minus Act

不确定sqldf包的功能有多大,但如何在不使用任何包/库的情况下在R中执行这些计算?

3 个答案:

答案 0 :(得分:1)

没有外部包

从你的例子:

data <- read.table(text='Est     Act     Tgt   Name
34      45      42    Tom
36      36      37    Tom
39      38      38    Tom
31      40      38   John
35      41      40   John', header=T, stringsAsFactors=F)

data$E_A <- data$Est - data$Act
data$T_A <- data$Tgt - data$Act

data2 <- data[,c("Name", "E_A", "T_A")]

我创建了一个具有统计功能的功能,可以进行调整。 (我添加标准偏差)

stat_summary <- function(data){
  data.frame(Min = min(data), 
             Max = max(data), 
             Avg = mean(data),
             Std = sd(data))
}

处理每个名称的函数:

group_by_name <- function(name, data){
  as.data.frame(lapply(data[data$Name == name, names(data) != "Name"], stat_summary))
}

最后我的摘要功能

my_summary <- function(data){
  t(sapply(unique(data$Name), group_by_name, data=data))
}

输出:

> my_summary(data2)
     E_A.Min E_A.Max E_A.Avg   E_A.Std  T_A.Min T_A.Max
Tom  -11     1       -3.333333 6.658328 -3      1      
John -9      -6      -7.5      2.12132  -2      -1     
     T_A.Avg    T_A.Std  
Tom  -0.6666667 2.081666 
John -1.5       0.7071068

使用外部包

使用dpylrtidyr

data %>% mutate(E_A = Est-Act, T_A = Tgt-Act) %>%
         gather("Type","Value",5:6) %>% 
         group_by(Name, Type) %>% 
         transmute(Min = min(Value), Max = max(Value), Avg = mean(Value)) %>% 
         distinct() %>% 
         ungroup() %>% 
         gather("Type2", "Value", 3:5) %>% 
         unite(Type, Type, Type2, sep = ".") %>% 
         spread(Type, Value)

给出输出:

Source: local data frame [2 x 7]

  Name   E_A.Avg E_A.Max E_A.Min    T_A.Avg T_A.Max T_A.Min
1 John -7.500000      -6      -9 -1.5000000      -1      -2
2  Tom -3.333333       1     -11 -0.6666667       1      -3

答案 1 :(得分:0)

不使用任何额外的套餐,这是一个良好的开端:

by(your_data[1:3], your_data[[4]], summary)

使用内置数据的示例:

> by(iris[1:4], iris[["Species"]], summary)
iris[["Species"]]: setosa
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
 Min.   :4.300   Min.   :2.300   Min.   :1.000   Min.   :0.100  
 1st Qu.:4.800   1st Qu.:3.200   1st Qu.:1.400   1st Qu.:0.200  
 Median :5.000   Median :3.400   Median :1.500   Median :0.200  
 Mean   :5.006   Mean   :3.428   Mean   :1.462   Mean   :0.246  
 3rd Qu.:5.200   3rd Qu.:3.675   3rd Qu.:1.575   3rd Qu.:0.300  
 Max.   :5.800   Max.   :4.400   Max.   :1.900   Max.   :0.600  
------------------------------------------------------------------ 
iris[["Species"]]: versicolor
  Sepal.Length    Sepal.Width     Petal.Length   Petal.Width   
 Min.   :4.900   Min.   :2.000   Min.   :3.00   Min.   :1.000  
 1st Qu.:5.600   1st Qu.:2.525   1st Qu.:4.00   1st Qu.:1.200  
 Median :5.900   Median :2.800   Median :4.35   Median :1.300  
 Mean   :5.936   Mean   :2.770   Mean   :4.26   Mean   :1.326  
 3rd Qu.:6.300   3rd Qu.:3.000   3rd Qu.:4.60   3rd Qu.:1.500  
 Max.   :7.000   Max.   :3.400   Max.   :5.10   Max.   :1.800  
------------------------------------------------------------------ 
iris[["Species"]]: virginica
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
 Min.   :4.900   Min.   :2.200   Min.   :4.500   Min.   :1.400  
 1st Qu.:6.225   1st Qu.:2.800   1st Qu.:5.100   1st Qu.:1.800  
 Median :6.500   Median :3.000   Median :5.550   Median :2.000  
 Mean   :6.588   Mean   :2.974   Mean   :5.552   Mean   :2.026  
 3rd Qu.:6.900   3rd Qu.:3.175   3rd Qu.:5.875   3rd Qu.:2.300  
 Max.   :7.900   Max.   :3.800   Max.   :6.900   Max.   :2.500  

如果您想要更多帮助格式化等,请提供可重现的示例。还请说明您的用例 - 您是否只想查看信息?您打算将其存储在数据框中吗?你正在为报告制作一张桌子吗?我问,因为你想要的输出不能很好地作为数据框 - 数据框的主要思想是每列应该有一个类/类型,即单个列中没有数字和字符串的混合。

答案 2 :(得分:0)

这将为您提供这些统计信息的未分组值:

 unlist( lapply( c("Est", "Tgt"), 
         function(coln) setNames( summary(my_df[[coln]]-my_df[["Act"]])[c(1,6,4)], 
                                  paste( coln, c('Min', 'Max', 'Avg'), sep="_"))))
Est_Min Est_Max Est_Avg Tgt_Min Tgt_Max Tgt_Avg 
    -11       1      -5      -3       1      -1 

现在您需要使用该策略按组进行操作:

fn_stats <- function(dfrm) unlist( lapply( c("Est", "Tgt"), 
               function(coln) setNames(summary(dfrm[[coln]]-dfrm[["Act"]])[c(1,6,4)], 
                                   paste( coln, c('Min', 'Max', 'Avg'), sep="_")
                                 )      )) 
round( t(sapply( split(my_df, my_df$Name) , fn_stats) ),2)

#----result---
     Est_Min Est_Max Est_Avg Tgt_Min Tgt_Max Tgt_Avg
John      -9      -6   -7.50      -2      -1   -1.50
Tom      -11       1   -3.33      -3       1   -0.67