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

R语言中用循环批量执行DEA计算并生成结果数据框

批量DEA计算并生成VA结果Data.frame

我来帮你搞定这个批量DEA计算的需求!咱们先理清楚思路:你已经有了包含3个data.frame的列表d3,现在要对每个data.frame重复执行DEA效率计算、加权平均,最后算出va值,再把所有va整理成一个新的data.frame。下面给你两种实用的实现方式:

第一步:先确认生成d3的代码(方便复现)

library(Benchmarking)
# 生成第一个data.frame d
x <- c(2, 3, 8)
y <- c(1, 5, 10)
k <- 25
d <- data.frame(x,y,k)
# 生成第二个data.frame d2
x <- c(5, 2, 3, 4)
y <- c(3, 5, 9, 10)
k <- 30
d2 <- data.frame(x,y,k)
# 生成包含3个data.frame的列表d3
d3 <- replicate(3, rbind(d, d2[sample(seq_len(nrow(d2)), 3), , drop=FALSE]), simplify = FALSE)

方法一:使用for循环(直观易懂)

这种方式适合刚接触R循环的朋友,逻辑清晰,每一步都能看明白:

# 初始化一个空向量,用来存储每个列表元素的va值
va_results <- numeric(length(d3))

# 循环遍历d3中的每个data.frame
for(i in seq_along(d3)){
  # 取出当前循环对应的data.frame
  current_df <- d3[[i]]
  
  # 筛选k=25的样本作为参考集,计算DEA效率
  ref_25 <- subset(current_df, k == 25)
  e1 <- dea(current_df$x, current_df$y, XREF = ref_25$x, YREF = ref_25$y)
  
  # 筛选k=30的样本作为参考集,计算DEA效率
  ref_30 <- subset(current_df, k == 30)
  e2 <- dea(current_df$x, current_df$y, XREF = ref_30$x, YREF = ref_30$y)
  
  # 计算加权平均效率(以y为权重)
  we1 <- weighted.mean(eff(e1), current_df$y)
  we2 <- weighted.mean(eff(e2), current_df$y)
  
  # 计算va并存储到结果向量中
  va_results[i] <- we2 / we1
}

# 将结果向量转换为最终的data.frame,group列对应d3中的元素索引
va_df <- data.frame(va = va_results, group = seq_along(d3))

方法二:使用lapply函数(更简洁的R风格)

R的函数式编程风格更适合处理列表,用lapply可以把重复逻辑封装成函数,代码更简洁易维护:

# 定义一个函数,输入单个data.frame,输出对应的va值
calculate_va <- function(df){
  # 筛选k=25的参考集并计算DEA
  ref_25 <- subset(df, k == 25)
  e1 <- dea(df$x, df$y, XREF = ref_25$x, YREF = ref_25$y)
  
  # 筛选k=30的参考集并计算DEA
  ref_30 <- subset(df, k == 30)
  e2 <- dea(df$x, df$y, XREF = ref_30$x, YREF = ref_30$y)
  
  # 计算加权平均效率
  we1 <- weighted.mean(eff(e1), df$y)
  we2 <- weighted.mean(eff(e2), df$y)
  
  # 返回va值
  return(we2 / we1)
}

# 用lapply对d3的每个元素应用calculate_va函数
va_list <- lapply(d3, calculate_va)

# 将列表结果转换为data.frame,group列对应d3的元素索引
va_df <- data.frame(va = unlist(va_list), group = seq_along(d3))

两种方法最终都会得到一个包含所有va值的data.frameva_df,其中group列对应原列表d3中第几个data.frame的计算结果,方便你后续分析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:15:03