如何将数据框行传入R的dpearson函数生成皮尔逊曲线?
解决方案
要实现将每个均值对应的x序列与df中对应行的矩参数配对传入dpearson,核心是让每组x和矩参数一一对应调用函数,以下是具体实现步骤:
- 准备数据与依赖
先加载包并初始化矩数据框和x序列列表:
library(PearsonDS) # 初始化矩参数数据框 df <- data.frame( mean = c(-6,-4,-2,0,2,4,6), variance = c(1,1,1,1,1,1,1), skewness = c(-2, -1, -0.5, 0, 0.5, 1, 2), kurtosis = c(7, 3, 1, 0, 1, 3, 7) ) # 生成每个均值对应的x序列列表 x <- Map(seq, df$mean - 3, df$mean + 3)
- 转换矩参数为命名向量列表
dpearson的moments参数需要命名向量(必须包含mean、variance、skewness、kurtosis四个命名元素),所以先把df的每一行转换为命名向量并存储为列表:
moments_list <- apply(df, 1, function(row) { setNames(as.numeric(row), names(df)) })
- 逐对调用dpearson
使用mapply(多变量apply)将x列表和矩参数列表一一配对,传入dpearson:
# 生成所有曲线的密度值,结果为列表,每个元素对应一条曲线的密度 curves <- mapply(function(x_vals, mom) { dpearson(x_vals, moments = mom) }, x, moments_list, SIMPLIFY = FALSE)
如果你习惯tidyverse语法,也可以用purrr::map2实现相同效果:
library(purrr) curves <- map2(x, moments_list, ~dpearson(.x, moments = .y))
为什么之前的写法失效?
你之前尝试的apply(df,1,dpearson(x[[1]],moments=df))存在两个问题:
apply的FUN参数需要是一个接受行数据作为输入的函数,而你直接传入dpearson时,参数没有正确绑定(x[[1]]会被固定为所有行的x值,且moments=df会传入整个数据框而非当前行)- 没有将df的行转换为
dpearson要求的命名向量格式
可选:可视化所有曲线
如果需要将生成的曲线可视化,可以整理数据后用ggplot2绘制:
library(ggplot2) library(tibble) # 整理为ggplot可用的长格式数据 plot_data <- map2_dfr(x, curves, function(x_vals, dens) { tibble(x = x_vals, density = dens) }, .id = "curve_id") # 绘制曲线 ggplot(plot_data, aes(x = x, y = density, color = curve_id)) + geom_line(linewidth = 1) + theme_minimal() + labs(title = "Pearson分布曲线", x = "X值", y = "密度")
内容的提问来源于stack exchange,提问作者aarsmith
相关产品推荐
相关产品推荐

