R 从数据框创建摘要统计表
我有以下5个变量的29个观测数据框(df):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
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)
让您了解了大部分内容。