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