You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 00:36:29