R 从数据框创建摘要统计表

R 从数据框创建摘要统计表,r,dataframe,R,Dataframe,我有以下5个变量的29个观测数据框(df): age height_seca1 height_chad1 height_DL weight_alog1 1 19 1800 1797 180 70 2 19 1682 1670 167 69 3 21 1765 1765 178 80

我有以下5个变量的29个观测数据框(df):

    age   height_seca1 height_chad1 height_DL weight_alog1
1   19         1800         1797       180           70
2   19         1682         1670       167           69
3   21         1765         1765       178           80
4   21         1829         1833       181           74
5   21         1706         1705       170          103
6   18         1607         1606       160           76
7   19         1578         1576       156           50
8   19         1577         1575       156           61
9   21         1666         1665       166           52
10  17         1710         1716       172           65
11  28         1616         1619       161           66
12  22         1648         1644       165           58
13  19         1569         1570       155           55
14  19         1779         1777       177           55
15  18         1773         1772       179           70
16  18         1816         1809       181           81
17  19         1766         1765       178           77
18  19         1745         1741       174           76
19  18         1716         1714       170           71
20  21         1785         1783       179           64
21  19         1850         1854       185           71
22  31         1875         1880       188           95
23  26         1877         1877       186          106
24  19         1836         1837       185          100
25  18         1825         1823       182           85
26  19         1755         1754       174           79
27  26         1658         1658       165           69
28  20         1816         1818       183           84
29  18         1755         1755       175           67

我希望获得每个变量的平均值、标准偏差、中位数、最小值、最大值和样本量,并将其作为数据框输出。我试着使用下面的代码,但后来我就不可能使用tapply或aggregate了,作为一个新手,我似乎无法使用tapply或aggregate。我的任务要求我不使用任何“额外”R包

apply(df, 2, mean)
apply(df, 2, sd)
apply(df, 2, median)
apply(df, 2, min)
apply(df, 2, max)
apply(df, 2, length)
理想情况下,这是输出数据框的外观,包括每个统计函数的行标题:

             age height_seca1 height_chad1    height_DL weight_alog1 
mean          20         1737         1736          173           73
sd            3.3         91.9         92.7          9.7         14.5 
median        19         1755         1755          175           71
minimum       17         1569         1570          155           50 
maximum       31         1877         1880          188          106
sample size   29           29           29           29           29 
my.summary <- function(x,...){
  c(mean=mean(x, ...),
    sd=sd(x, ...),
    median=median(x, ...),
    min=min(x, ...),
    max=max(x,...), 
    n=length(x))
}

# all these calls should give you the same results.
apply(df, 2, my.summary)
sapply(df, my.summary)
do.call(cbind,lapply(df, my.summary))

任何帮助都将不胜感激

尝试fBasics软件包中的
basicStats

> install.packages("fBasics")
> library(fBasics)
> basicStats(df)
                   age height_seca1 height_chad1   height_DL weight_alog1
nobs         29.000000    29.000000    29.000000   29.000000    29.000000
NAs           0.000000     0.000000     0.000000    0.000000     0.000000
Minimum      17.000000  1569.000000  1570.000000  155.000000    50.000000
Maximum      31.000000  1877.000000  1880.000000  188.000000   106.000000
1. Quartile  19.000000  1666.000000  1665.000000  166.000000    65.000000
3. Quartile  21.000000  1816.000000  1809.000000  181.000000    80.000000
Mean         20.413793  1737.241379  1736.482759  173.379310    73.413793
Median       19.000000  1755.000000  1755.000000  175.000000    71.000000
Sum         592.000000 50380.000000 50358.000000 5028.000000  2129.000000
SE Mean       0.612910    17.069018    17.210707    1.798613     2.700354
LCL Mean     19.158305  1702.277081  1701.228224  169.695018    67.882368
UCL Mean     21.669282  1772.205677  1771.737293  177.063602    78.945219
Variance     10.894089  8449.189655  8590.044335   93.815271   211.465517
Stdev         3.300619    91.919474    92.682492    9.685828    14.541854
Skewness      1.746597    -0.355499    -0.322915   -0.430019     0.560360
Kurtosis      2.290686    -1.077820    -1.086108   -1.040182    -0.311017
您还可以将输出子集以获得所需内容:

> basicStats(df)[c("Mean", "Stdev", "Median", "Minimum", "Maximum", "nobs"),]
              age height_seca1 height_chad1  height_DL weight_alog1
Mean    20.413793   1737.24138   1736.48276 173.379310     73.41379
Stdev    3.300619     91.91947     92.68249   9.685828     14.54185
Median  19.000000   1755.00000   1755.00000 175.000000     71.00000
Minimum 17.000000   1569.00000   1570.00000 155.000000     50.00000
Maximum 31.000000   1877.00000   1880.00000 188.000000    106.00000
nobs    29.000000     29.00000     29.00000  29.000000     29.00000
另一种选择是,按照中的定义自己的函数

更新:
(我没有读过“我的作业要求我不要使用任何‘额外’R软件包。”部分)

如前所述,您可以使用
*apply
系列函数定义自己的函数并在每列上循环:

             age height_seca1 height_chad1    height_DL weight_alog1 
mean          20         1737         1736          173           73
sd            3.3         91.9         92.7          9.7         14.5 
median        19         1755         1755          175           71
minimum       17         1569         1570          155           50 
maximum       31         1877         1880          188          106
sample size   29           29           29           29           29 
my.summary <- function(x,...){
  c(mean=mean(x, ...),
    sd=sd(x, ...),
    median=median(x, ...),
    min=min(x, ...),
    max=max(x,...), 
    n=length(x))
}

# all these calls should give you the same results.
apply(df, 2, my.summary)
sapply(df, my.summary)
do.call(cbind,lapply(df, my.summary))

my.summary您可以使用
lappy
查看每一列,并使用匿名函数执行每一项计算:

res <- lapply( mydf , function(x) rbind( mean = mean(x) ,
                                  sd = sd(x) ,
                                  median = median(x) ,
                                  minimum = min(x) ,
                                  maximum = max(x) ,
                                  s.size = length(x) ) )

data.frame( res )
#              age height_seca1 height_chad1  height_DL weight_alog1
#mean    20.413793   1737.24138   1736.48276 173.379310     73.41379
#sd       3.300619     91.91947     92.68249   9.685828     14.54185
#median  19.000000   1755.00000   1755.00000 175.000000     71.00000
#minimum 17.000000   1569.00000   1570.00000 155.000000     50.00000
#maximum 31.000000   1877.00000   1880.00000 188.000000    106.00000
#s.size  29.000000     29.00000     29.00000  29.000000     29.00000

res或使用您已经完成的内容,您只需将这些摘要放入列表并使用
do.call

df <- structure(list(age = c(19L, 19L, 21L, 21L, 21L, 18L, 19L, 19L, 21L, 17L, 28L, 22L, 19L, 19L, 18L, 18L, 19L, 19L, 18L, 21L, 19L, 31L, 26L, 19L, 18L, 19L, 26L, 20L, 18L), height_seca1 = c(1800L, 1682L, 1765L, 1829L, 1706L, 1607L, 1578L, 1577L, 1666L, 1710L, 1616L, 1648L, 1569L, 1779L, 1773L, 1816L, 1766L, 1745L, 1716L, 1785L, 1850L, 1875L, 1877L, 1836L, 1825L, 1755L, 1658L, 1816L, 1755L), height_chad1 = c(1797L, 1670L, 1765L, 1833L, 1705L, 1606L, 1576L, 1575L, 1665L, 1716L, 1619L, 1644L, 1570L, 1777L, 1772L, 1809L, 1765L, 1741L, 1714L, 1783L, 1854L, 1880L, 1877L, 1837L, 1823L, 1754L, 1658L, 1818L, 1755L), height_DL = c(180L, 167L, 178L, 181L, 170L, 160L, 156L, 156L, 166L, 172L, 161L, 165L, 155L, 177L, 179L, 181L, 178L, 174L, 170L, 179L, 185L, 188L, 186L, 185L, 182L, 174L, 165L, 183L, 175L), weight_alog1 = c(70L, 69L, 80L, 74L, 103L, 76L, 50L, 61L, 52L, 65L, 66L, 58L, 55L, 55L, 70L, 81L, 77L, 76L, 71L, 64L, 71L, 95L, 106L, 100L, 85L, 79L, 69L, 84L, 67L)), class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29"))

tmp <- do.call(data.frame, 
           list(mean = apply(df, 2, mean),
                sd = apply(df, 2, sd),
                median = apply(df, 2, median),
                min = apply(df, 2, min),
                max = apply(df, 2, max),
                n = apply(df, 2, length)))
tmp

                   mean        sd median  min  max  n
age            20.41379  3.300619     19   17   31 29
height_seca1 1737.24138 91.919474   1755 1569 1877 29
height_chad1 1736.48276 92.682492   1755 1570 1880 29
height_DL     173.37931  9.685828    175  155  188 29
weight_alog1   73.41379 14.541854     71   50  106 29

到目前为止,我有同样的问题,我写

h <- function(x, flist){
  f <- function(f,...)f(...)
  g <- function(x, flist){vapply(flist, f , x, FUN.VALUE = numeric(1))}
  df <- as.data.frame(lapply(x, g , flist))
  row.names(df) <- names(flist)
  df

}

h(cars, flist = list(mean = mean, median = median, std_dev =  sd))

h为快速探索性数据分析(EDA)添加更多选项

1)套餐:

install.packages(“skimr”)
图书馆(略读)
撇渣(df)

2)套餐:

install.packages(“ExPanDaR”)
图书馆(ExPanDaR)
#将数据和代码导出到笔记本
展开(df,export\u nb\u option=TRUE)
#打开一个闪亮的应用程序
扩展(df)

3)套餐:

install.packages(“DescTools”)
库(描述工具)
描述(df,plotit=TRUE)
#> ------------------------------------------------------------------------------ 
#>描述df(数据帧):
#> 
#>数据帧:29 obs。由5个变量组成
#>29个完整案例(100.0%)
#> 
#>Nr ColName类NAs级别
#>1个年龄整数。
#>2高度_seca1整数。
#>3高度1整数。
#>4高度_DL整数。
#>5加权1整数。
#> 
#> 
#> ------------------------------------------------------------------------------ 
#>1-年龄(整数)
#> 
#>长度n平均值
#>       29      29      0       9      0  20.41   19.16
#>           100.0%   0.0%           0.0%          21.67
#>                                                      
#>.05.10.25中位数.75.90.95
#>    18.00   18.00  19.00   19.00  21.00  26.00   27.20
#>                                                      
#>范围sd vcoef mad IQR歪斜库尔特
#>    14.00    3.30   0.16    1.48   2.00   1.75    2.29
#>                                                      
#> 
#>电平频率周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期周期
#> 1     17     1   3.4%        1     3.4%
#> 2     18     6  20.7%        7    24.1%
#> 3     19    11  37.9%       18    62.1%
#> 4     20     1   3.4%       19    65.5%
#> 5     21     5  17.2%       24    82.8%
#> 6     22     1   3.4%       25    86.2%
#> 7     26     2   6.9%       27    93.1%
#> 8     28     1   3.4%       28    96.6%
#> 9     31     1   3.4%       29   100.0%
#> 
#>堆(?):模式的显著频率(37.9%)(=19)

Desc
的结果可以保存到Microsoft Word docx文件中

需要使用RDCOMClient包 install.packages(“RDCOMClient”,repos=”http://www.omegahat.net/R") #或 devtools::install_github(“omegahat/RDCOMClient”) #创建一个新单词实例并插入标题和内容
是的,它必须使用
install.packages(“fBasics”)
“我的任务要求我不要使用任何‘额外’的R软件包”我知道这是一个老问题。但是,为了避免“额外”的R软件包,您可以安装fBasic软件包,然后查看:fBasic::basicStats完整的功能代码是R basefunctions@JilberUrbina额外省略号的用途是什么?无需多次调用
apply
,请参阅。您可以定义一个函数,然后使用
apply
lappy
sapply
)在调用
*apply
函数的列上循环一次。当然,有很多方法可以做到这一点,而且只需较少的按键,但这种方法使用OP自己的方法(我只是复制/粘贴)他/她似乎已经理解了这一点,并简单地添加了一些方法以获得所需的结果。不要像大多数其他答案所显示的那样采取完全不同的方法。请注意,这不是一种“完全不同的方法”,而是相同的方法,但不是每次更改函数时调用
apply
,而是只调用一次。请注意,我不想与您争论语义。但是一定要尝试使用
lappy(df,mean)
apply(df,mean)
并告诉我你得到了什么。可能是OP不知道
lappy
,因此这对他/她来说是一个新功能。试着争辩一下。我不确定你从这次讨论中得到了什么。
apply(df,mean)
是一个废话,我知道你没有明白我的意思,我只是试图对你的答案进行评论,指出这样一个事实:每次使用apply都会减慢代码的速度,相反,你可以只使用一次
apply
函数来循环列。查看我的更新以了解我的意思。无论如何,您的答案提供了所需的输出。也许我们应该删除这些评论,以保持您的答案清晰。
summary(df)
让您了解了大部分内容。