R 多个同名列的统计信息
我有一个巨大的数据集,有多个列,如R 多个同名列的统计信息,r,statistics,dplyr,R,Statistics,Dplyr,我有一个巨大的数据集,有多个列,如x1,x2,x3,x25,y1,y2,y3,y50,z1,z2,z10,等等。看起来像这样: x1 x2 x3 x4 y1 y2 y3 1 2 1 2 1 1 2 2 1 1 1 3 1 1 1 2 2 1 1 2 1 我想要的是: x_mean x_min x_max x_mad y_mean y_min y_max y_mad 1.5 1
x1
,x2
,x3
,x25
,y1
,y2
,y3
,y50
,z1
,z2
,z10
,等等。看起来像这样:
x1 x2 x3 x4 y1 y2 y3
1 2 1 2 1 1 2
2 1 1 1 3 1 1
1 2 2 1 1 2 1
我想要的是:
x_mean x_min x_max x_mad y_mean y_min y_max y_mad
1.5 1 2 0.74 2 1 2 0
1.25 1 2 0 2 1 2 0
1.5 1 2 0.74 2 1 2 0
基本上,我需要计算min
、max
、mad
(中值绝对偏差)和mean
> x_mean = (x1+x2+x3+x4)/4 = (1+2+1+2)/4
对于其他行和其他统计数据也是如此。如何在R中做到这一点,最好是在dplyr中?通常,您可以使用
summary
的作用域变量,如summary\u all
,它们在funs
助手函数中可以接受任意数量的摘要函数。在您的情况下,您应该首先将其重塑为长格式,以便使您的数据(此处将观察值从列移动到行),从而使您的分析更简单:
库(tidyverse)
df%#保留职位信息
聚集(var,val,-行)%>%#重塑为长形
mutate(var=sub('\\d','',var))#从以前的colname中提取字母
df_汇总%
分组依据(变量,行)%>%#分组依据变量和原始行
总结所有功能(funs(最小、最大、最大)#总结各种功能
df_摘要
#>#tibble:6 x 5
#>#组:var[?]
#>var行最小最大mad
#>
#>1x1120.7413
#>2x2120.0000
#>3x120.7413
#>4 y 1 1 2 0.0000
#>5 y 2 1 3 0.0000
#>6 y 31 2 0.0000
如果您愿意,您可以将其改宽,但出于任何目的,我建议您不要使用它。不像
tidyverse
方法那样优雅,但仍然是一个基本的R选项
#create a function to do whatever calculations needed,
f1 <- function(d){
mean1 <- rowMeans(d)
min1 <- do.call(pmin, d)
max1 <- do.call(pmax, d)
mad1 <- apply(d, 1, mad)
return(data.frame(mean1, min1, max1, mad1))
}
#apply it to your data frame based on the unique name letters,
ind <- unique(sub('\\d+', '', names(df)))
setNames(lapply(ind, function(i) f1(df[grepl(i, names(df))])), ind)
#$x
# mean1 min1 max1 mad1
#1 1.50 1 2 0.7413
#2 1.25 1 2 0.0000
#3 1.50 1 2 0.7413
#$y
# mean1 min1 max1 mad1
#1 1.333333 1 2 0
#2 1.666667 1 3 0
#3 1.333333 1 2 0
我们还可以使用
matrixStats
包中的row..
函数进行此操作
library(matrixStats)
do.call(cbind, lapply(split.default(df1, sub("\\d+", "", names(df1))), function(x) {
x1 <- as.matrix(x)
data.frame(mean = rowMeans(x1), min = rowMins(x1), max = rowMaxs(x1), mad = rowMads(x1))}))
# x.mean x.min x.max x.mad y.mean y.min y.max y.mad
#1 1.50 1 2 0.7413 1.333333 1 2 0
#2 1.25 1 2 0.0000 1.666667 1 3 0
#3 1.50 1 2 0.7413 1.333333 1 2 0
库(matrixStats)
函数(x){
x1
library(matrixStats)
do.call(cbind, lapply(split.default(df1, sub("\\d+", "", names(df1))), function(x) {
x1 <- as.matrix(x)
data.frame(mean = rowMeans(x1), min = rowMins(x1), max = rowMaxs(x1), mad = rowMads(x1))}))
# x.mean x.min x.max x.mad y.mean y.min y.max y.mad
#1 1.50 1 2 0.7413 1.333333 1 2 0
#2 1.25 1 2 0.0000 1.666667 1 3 0
#3 1.50 1 2 0.7413 1.333333 1 2 0