在R中基于pdqr包按数据行匹配分布函数计算均值
批量计算pdqr分布函数的均值(基于数据框中的函数名称)
问题核心
你遇到的错误根源在于:summ_mean()需要接收pdqr函数对象,但df$distr存储的是函数名称的字符串,直接传递无法被识别;invoke_map()会直接调用函数(需要传入x参数),但我们需要的是把函数对象传给summ_mean(),而非执行函数本身。
解决方案
方法1:使用get()映射字符串到函数对象(base R/tidyverse通用)
利用get()函数将字符串转换为全局环境中对应的pdqr函数对象,再批量传入summ_mean():
Base R 实现
library(pdqr) # 定义分布函数 A <- as_d(function(x)dnorm(x, mean = 3, sd = 1)) B <- as_d(function(x)dnorm(x, mean = 6, sd = 1)) C <- as_d(function(x)dnorm(x, mean = 2, sd = 2)) df <- data.frame(distr = c("A", "C", "A", "B", "B", "A", "C")) # 批量计算均值 df$distr_mean <- sapply(df$distr, function(func_name) summ_mean(get(func_name)))
Tidyverse 实现
library(pdqr) library(dplyr) library(purrr) # 定义分布函数 A <- as_d(function(x)dnorm(x, mean = 3, sd = 1)) B <- as_d(function(x)dnorm(x, mean = 6, sd = 1)) C <- as_d(function(x)dnorm(x, mean = 2, sd = 2)) df <- data.frame(distr = c("A", "C", "A", "B", "B", "A", "C")) # 批量计算均值 df <- df %>% mutate(distr_mean = map_dbl(distr, ~summ_mean(get(.x))))
方法2:用列表管理分布函数(更安全规范)
把所有pdqr函数集中存入一个列表,通过列表索引匹配字符串,避免依赖全局环境中的变量:
library(pdqr) library(dplyr) library(purrr) # 将分布函数存入列表统一管理 distr_list <- list( A = as_d(function(x)dnorm(x, mean = 3, sd = 1)), B = as_d(function(x)dnorm(x, mean = 6, sd = 1)), C = as_d(function(x)dnorm(x, mean = 2, sd = 2)) ) df <- data.frame(distr = c("A", "C", "A", "B", "B", "A", "C")) # 批量计算均值 df <- df %>% mutate(distr_mean = map_dbl(distr, ~summ_mean(distr_list[[.x]])))
结果验证
运行后df会新增distr_mean列,对应每行分布的均值:
print(df) # distr distr_mean # 1 A 3 # 2 C 2 # 3 A 3 # 4 B 6 # 5 B 6 # 6 A 3 # 7 C 2
内容的提问来源于stack exchange,提问作者Johan Vos
相关产品推荐
相关产品推荐

