我在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
中执行这些计算?
答案 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
使用外部包
使用dpylr
和tidyr
:
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