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

基于R语言扩展Guess Who游戏条件概率计算函数求助

改写后的R函数

以下是扩展后的函数,既保留原有的筛选功能,又支持计算指定条件下的条件概率:

my_function <- function(dataset, input_var_list = NULL, conditional_var = NULL, var1 = NULL, var2 = NULL, var3 = NULL, var4 = NULL) {
  
  # 从单个变量参数构建条件列表(兼容旧调用方式)
  if (is.null(input_var_list)) {
    input_var_list <- list()
    if (!is.null(var1)) input_var_list$var1 <- var1
    if (!is.null(var2)) input_var_list$var2 <- var2
    if (!is.null(var3)) input_var_list$var3 <- var3
    if (!is.null(var4)) input_var_list$var4 <- var4
  }
  
  # 验证条件列表的有效性
  if (length(input_var_list) > 0) {
    if (!is.list(input_var_list) || is.null(names(input_var_list)) || any(names(input_var_list) == "")) {
      stop("input_var_list必须是命名列表,每个名称对应数据集中的列")
    }
    if (!all(names(input_var_list) %in% colnames(dataset))) {
      missing_vars <- setdiff(names(input_var_list), colnames(dataset))
      stop(paste("数据集中不存在以下变量:", paste(missing_vars, collapse = ", ")))
    }
  }
  
  # 根据条件筛选数据集
  filtered_data <- dataset
  if (length(input_var_list) > 0) {
    for (var_name in names(input_var_list)) {
      filtered_data <- filtered_data[filtered_data[[var_name]] %in% input_var_list[[var_name]], ]
    }
  }
  
  # 若未指定条件概率变量,返回筛选后的数据集(兼容旧功能)
  if (is.null(conditional_var)) {
    return(filtered_data)
  }
  
  # 验证条件概率变量是否存在
  if (!conditional_var %in% colnames(dataset)) {
    stop(paste("条件概率变量", conditional_var, "不存在于数据集中"))
  }
  
  # 计算筛选后数据的总计数
  total_count <- sum(filtered_data$counts)
  
  # 处理总计数为0的情况(避免除以0)
  if (total_count == 0) {
    all_levels <- levels(dataset[[conditional_var]])
    result <- data.frame(
      level = all_levels,
      probability = rep(0, length(all_levels))
    )
    colnames(result)[1] <- conditional_var
    return(result)
  }
  
  # 按条件概率变量分组求和
  counts_per_level <- aggregate(counts ~ ., data = filtered_data[, c(conditional_var, "counts")], sum)
  
  # 获取条件概率变量的所有水平(包括筛选后未出现的)
  all_levels <- data.frame(level = levels(dataset[[conditional_var]]))
  colnames(all_levels)[1] <- conditional_var
  
  # 合并数据,补全缺失水平的计数为0
  result <- merge(all_levels, counts_per_level, by = conditional_var, all.x = TRUE)
  result$counts[is.na(result$counts)] <- 0
  
  # 计算条件概率
  result$probability <- result$counts / total_count
  
  # 返回仅包含条件变量和概率的结果
  return(result[, c(conditional_var, "probability")])
}

使用示例

1. 原有筛选功能(兼容旧调用方式)

筛选黑发/棕发且戴眼镜的运动员:

filtered_data <- my_function(dataset, var1 = c("black", "brown"), var2 = "yes")

2. 计算条件概率

计算黑发/棕发且踢足球时,不同眼镜类型的条件概率:

prob_result <- my_function(
  dataset, 
  input_var_list = list(var1 = c("black", "brown"), var3 = "football"), 
  conditional_var = "var2"
)

返回结果示例:

var2 probability
1 contact lenses   0.1500000
2           no   0.3500000
3          yes   0.5000000

功能说明

  • 兼容性:保留原有的单个变量参数(var1/var2等)调用方式,同时支持新的input_var_list参数批量指定条件
  • 鲁棒性:处理筛选后无数据的情况,返回所有水平的概率为0
  • 完整性:包含条件概率变量的所有原始水平,即使某些水平在筛选后未出现

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:05:18