r 拆分应用组合问题
r split-apply-combine problems
我是 r 的新手,有一个很大的 data.frame(906 行),我想(行?)将 data.frame 分成第一列(与相同的条目相关联的条目)名称在一起),然后再对其余列应用多个描述性统计信息(平均值、标准差、标准 error/variance、25% 和 75% 置信区间、最小值、最大值和中值)。与每个物种相关联的行数不一样,所以它是 uneven/unbalanced 拆分。 “par”列中散布着很多 na(每行至少有 1 个列条目)但我只想 ignore/skip 覆盖 na 而不是 delete/omit 行。Heres a picture of my initial data.frame -column names are not the actual column names I'm using
我希望我的最终输出显示:一列名称,一列描述性统计数据,一列描述性统计结果(每个参数一列)。I've included a picture of what I want the table output to look like, if it's possible (values in par columns aren't actually the calculated stats I just put random stuff in to fill the frame) 一切到目前为止我已经尝试过,没有奏效。同样,我也很新,我不太确定我在做什么,请帮忙。
通常,您可以通过查看 R 附带的内容为您的可重现示例找到合适的数据(data()
将显示数据集列表和简要说明)。比如iris
这个数据集和你的差不多,只是最后一列是物种名:
data(iris)
iris <- iris[, c(5, 1:4)]
iris.splt <- split(iris[, 2:5], iris[, 1])
现在我们已经加载了数据,将最后一列移到了第一个位置,并将数据集按物种拆分为 3 个数据帧,这些数据帧存储在一个名为 iris.splt
的列表中。
物种名称是列表每个部分的名称,只有数据存储在该列表部分的数据框中。现在您需要编写一个函数来计算您需要的统计信息。这是一个基于您提供的图片的示例,但您可能需要更改它:
stats <- function(x) {
quant=as.matrix(quantile(x, na.rm=TRUE))
mean=mean(x, na.rm=TRUE)
sd=sd(x, na.rm=TRUE)
var=var(x, na.rm=TRUE)
return(rbind(quant, mean, sd, var))
}
这会计算单个列的统计信息。我们需要使用 lapply
函数两次 运行 列表每个部分的每一列上的函数,然后第三次将列组合在一起:
iris.stats <- lapply(iris.splt, function(x) lapply(x, stats))
iris.dfs <- lapply(iris.stats, data.frame)
iris.dfs
# $setosa
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# 0% 4.3000 2.3000 1.00000 0.10000
# 25% 4.8000 3.2000 1.40000 0.20000
# 50% 5.0000 3.4000 1.50000 0.20000
# 75% 5.2000 3.6750 1.57500 0.30000
# 100% 5.8000 4.4000 1.90000 0.60000
# mean 5.0060 3.4280 1.46200 0.24600
# sd 0.3525 0.3791 0.17366 0.10539
# var 0.1242 0.1437 0.03016 0.01111
#
# $versicolor
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# 0% 4.9000 2.00000 3.0000 1.00000
# 25% 5.6000 2.52500 4.0000 1.20000
# 50% 5.9000 2.80000 4.3500 1.30000
# 75% 6.3000 3.00000 4.6000 1.50000
# 100% 7.0000 3.40000 5.1000 1.80000
# mean 5.9360 2.77000 4.2600 1.32600
# sd 0.5162 0.31380 0.4699 0.19775
# var 0.2664 0.09847 0.2208 0.03911
#
# $virginica
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# 0% 4.9000 2.2000 4.5000 1.40000
# 25% 6.2250 2.8000 5.1000 1.80000
# 50% 6.5000 3.0000 5.5500 2.00000
# 75% 6.9000 3.1750 5.8750 2.30000
# 100% 7.9000 3.8000 6.9000 2.50000
# mean 6.5880 2.9740 5.5520 2.02600
# sd 0.6359 0.3225 0.5519 0.27465
# var 0.4043 0.1040 0.3046 0.07543
您必须决定要如何使用此列表,或者是否要将其组合回单个数据框,但这应该可以帮助您入门。
我是 r 的新手,有一个很大的 data.frame(906 行),我想(行?)将 data.frame 分成第一列(与相同的条目相关联的条目)名称在一起),然后再对其余列应用多个描述性统计信息(平均值、标准差、标准 error/variance、25% 和 75% 置信区间、最小值、最大值和中值)。与每个物种相关联的行数不一样,所以它是 uneven/unbalanced 拆分。 “par”列中散布着很多 na(每行至少有 1 个列条目)但我只想 ignore/skip 覆盖 na 而不是 delete/omit 行。Heres a picture of my initial data.frame -column names are not the actual column names I'm using
我希望我的最终输出显示:一列名称,一列描述性统计数据,一列描述性统计结果(每个参数一列)。I've included a picture of what I want the table output to look like, if it's possible (values in par columns aren't actually the calculated stats I just put random stuff in to fill the frame) 一切到目前为止我已经尝试过,没有奏效。同样,我也很新,我不太确定我在做什么,请帮忙。
通常,您可以通过查看 R 附带的内容为您的可重现示例找到合适的数据(data()
将显示数据集列表和简要说明)。比如iris
这个数据集和你的差不多,只是最后一列是物种名:
data(iris)
iris <- iris[, c(5, 1:4)]
iris.splt <- split(iris[, 2:5], iris[, 1])
现在我们已经加载了数据,将最后一列移到了第一个位置,并将数据集按物种拆分为 3 个数据帧,这些数据帧存储在一个名为 iris.splt
的列表中。
物种名称是列表每个部分的名称,只有数据存储在该列表部分的数据框中。现在您需要编写一个函数来计算您需要的统计信息。这是一个基于您提供的图片的示例,但您可能需要更改它:
stats <- function(x) {
quant=as.matrix(quantile(x, na.rm=TRUE))
mean=mean(x, na.rm=TRUE)
sd=sd(x, na.rm=TRUE)
var=var(x, na.rm=TRUE)
return(rbind(quant, mean, sd, var))
}
这会计算单个列的统计信息。我们需要使用 lapply
函数两次 运行 列表每个部分的每一列上的函数,然后第三次将列组合在一起:
iris.stats <- lapply(iris.splt, function(x) lapply(x, stats))
iris.dfs <- lapply(iris.stats, data.frame)
iris.dfs
# $setosa
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# 0% 4.3000 2.3000 1.00000 0.10000
# 25% 4.8000 3.2000 1.40000 0.20000
# 50% 5.0000 3.4000 1.50000 0.20000
# 75% 5.2000 3.6750 1.57500 0.30000
# 100% 5.8000 4.4000 1.90000 0.60000
# mean 5.0060 3.4280 1.46200 0.24600
# sd 0.3525 0.3791 0.17366 0.10539
# var 0.1242 0.1437 0.03016 0.01111
#
# $versicolor
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# 0% 4.9000 2.00000 3.0000 1.00000
# 25% 5.6000 2.52500 4.0000 1.20000
# 50% 5.9000 2.80000 4.3500 1.30000
# 75% 6.3000 3.00000 4.6000 1.50000
# 100% 7.0000 3.40000 5.1000 1.80000
# mean 5.9360 2.77000 4.2600 1.32600
# sd 0.5162 0.31380 0.4699 0.19775
# var 0.2664 0.09847 0.2208 0.03911
#
# $virginica
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# 0% 4.9000 2.2000 4.5000 1.40000
# 25% 6.2250 2.8000 5.1000 1.80000
# 50% 6.5000 3.0000 5.5500 2.00000
# 75% 6.9000 3.1750 5.8750 2.30000
# 100% 7.9000 3.8000 6.9000 2.50000
# mean 6.5880 2.9740 5.5520 2.02600
# sd 0.6359 0.3225 0.5519 0.27465
# var 0.4043 0.1040 0.3046 0.07543
您必须决定要如何使用此列表,或者是否要将其组合回单个数据框,但这应该可以帮助您入门。