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
相关产品推荐
相关产品推荐

