我有一个非常大的数据文件(> 300k 行),每一行都是唯一样本(> 3000 个样本)的一部分。我想为每个单独的样本生成一个核密度估计器,并将相关信息(最小值、最大值、密度估计器的最大概率、密度估计器的中值、密度估计器的平均值)与样本名称一起提取到一个单独的表中。
我尝试使用此处列出的方法
从ggplot
函数中提取信息,为 geom_density_ridges 添加平均值,并在geom_density_ridges 上画线,从中提取数据,但它没有提供我想要的所有信息 。stat_density_ridges()
stat_density_ridges
ggplot_build
purrr::pluck
以下生成一些类似于我想要的合成数据:
set.seed(1)
x = runif( 50, max = 40, min = 20 )
set.seed(2)
y = runif( 50, max = 300, min = 100 )
sample.number = c( rep( 1, 20 ), rep( 2, 15 ), rep( 3, 5 ), rep( 4, 10 ) )
d <- data.frame( x, y , sample.number )
其中的图ggplot
显示了分布:
ggplot( data = d, aes( x = x, y = as.factor( samples ) ) ) +
labs( x = expression( paste( "x" ) ),
y = expression( paste( "sample number" ) ) ) +
stat_density_ridges()
我想最终得到一个包含以下信息的数据表:
sample.name
, max(x)
, min(x)
, 内核密度估计器的最大高度及其x
位置,内核密度估计器的中值高度及其x
位置等。
我唯一能想到的就是创建一个漫长而艰巨的循环
sample.numbers <- rep( NA, times = max( d$sample.number ) )
max.x <- rep( NA, times = max( d$sample.number ) )
min.x <- rep( NA, times = max( d$sample.number ) )
for( i in 1:max( d$sample.number ) ) {
temp.d = d[ d$sample.number == i, ]
sample.numbers[ i ] = i
max.x[ i ] = max( temp.d$x )
min.x[ i ] = min( temp.d$x )
}
然后以某种方式添加一些创建密度估计器并从中提取信息的位。我猜 R 中的索引为我在使用时拥有的数千个样本提供了一种更简单的方法来解决这个问题group_by
,但我无法弄清楚。请注意,我仍然无法理解 R 中的管道,因此如果解决方案中有这些,可能需要一些简单的解释。