【问题标题】:Divide a weigthed average in a loop在循环中划分加权平均值
【发布时间】:2018-04-27 07:40:17
【问题描述】:

考虑以下数据:

datamichael <- data.frame(x=c(100,200,300,500), y=c(75,100,300,400),  row.names = LETTERS[1:4])
dataewan    <- data.frame(x=c(200,50,200,600),  y=c(100,100,400,300), row.names = LETTERS[1:4])
datatom     <- data.frame(x=c(100,150,400,200), y=c(100,100,400,300), row.names = LETTERS[1:4])

datamichaeldataewan <- rbind(datamichael,dataewan)
datamichaeldatatom  <- rbind(datamichael,datatom)
dataewandatamichael <- rbind(dataewan, datamichael)
dataewandatatom     <- rbind(dataewan, datatom)
datatomdatamichael  <- rbind(datatom, datamichael)
datatomdataewan     <- rbind(datatom, dataewan)

library(Benchmarking)
effmichaelewan <- dea(datamichaeldataewan$x,datamichaeldataewan$y, XREF=datamichael$x, YREF=datamichael$y)
effmichaeltom  <- dea(datamichaeldatatom$x,datamichaeldatatom$y, XREF=datamichael$x, YREF=datamichael$y)
effewanmichael <- dea(dataewandatamichael$x,dataewandatamichael$y, XREF=dataewan$x, YREF=dataewan$y)
effewantom     <- dea(dataewandatatom$x,dataewandatatom$y, XREF=dataewan$x, YREF=dataewan$y)
efftommichael  <- dea(datatomdatamichael$x,datatomdatamichael$y, XREF=datatom$x, YREF=datatom$y)
efftomewan     <- dea(datatomdataewan$x,datatomdataewan$y, XREF=datatom$x, YREF=datatom$y)

我知道我的命名习惯有点混乱。现在我想计算迈克尔的加权平均值。那就是:

result1 <- (weighted.mean(eff(effmichaelewan), datamichaeldataewan$y)/
            weighted.mean(eff(effewanmichael), dataewandatamichael$y))
result2 <- (weighted.mean(eff(effmichaeltom), datamichaeldatatom$y)/
            weighted.mean(eff(efftommichael), datatomdatamichael$y))

是否可以通过循环进行计算?因为我有超过 2 个合并数据,Tom 的数据应该与之分开。

【问题讨论】:

  • 啊,当然可以。那就是问题所在。谢谢!

标签: r loops weighted-average


【解决方案1】:

你可以这样做:

L <- list(datamichael, dataewan, datatom)

library(Benchmarking)
result <- function(x) {
  d1 <- rbind(x[[1]], x[[2]])
  d2 <- rbind(x[[2]], x[[1]])
  eff.d1 <- dea(d1$x, d1$y)
  eff.d2 <- dea(d2$x, d2$y)
  weighted.mean(eff(eff.d1), d1$y) / weighted.mean(eff(eff.d2), d2$y)
}
combn(L, 2, FUN=result)

要知道你可以做的名字:

n <- c("michael", "ewan", "tom")
combn(n, 2)

数据:

datamichael <- data.frame(x=c(100,200,300,500), y=c(75,100,300,400),  row.names = LETTERS[1:4])
dataewan    <- data.frame(x=c(200,50,200,600),  y=c(100,100,400,300), row.names = LETTERS[1:4])
datatom     <- data.frame(x=c(100,150,400,200), y=c(100,100,400,300), row.names = LETTERS[1:4])

【讨论】:

  • 感谢您的回答。如果我使用它,我只会得到结果:[1] 1 1 1。你得到相同的结果还是我遗漏了什么?
  • 我也试过写result(L)result(datamichael),但是没有用。
  • 好的。但后来我不明白结果。因为如果我使用自己的代码,我会得到结果:result1=0.867...result2=1。这是我感兴趣的结果。
  • 一个问题:为什么我得到3个结果(我只对2个分数感兴趣-我认为这是第一个和最后一个分数)?中间分数代表什么?
  • 啊,我明白了。但我只对 MichaelEwan 和 MichaelTom 感兴趣 - 那么是否有可能只获得前两个结果?还有一个问题:我想将eff.d2 &lt;- dea(d2$x, d2$y) 编辑为eff.d2 &lt;- dea(d2$x, d2$y, XREF=xname, YREF=yname),其中xname=(x2, x3)yname=(y2, y3)。也就是说,当我想要 MichaelEwan 的结果(第一个结果)时,然后是 XREF=x2YREF=y2,当我想要 MichaelTom 的结果时,然后是 XREF=x3YREF=y3。是否可以将其包含在函数中?希望你明白我的意思。
【解决方案2】:

您可以将输出(dataXXXXXX 和 effXXXXXXX)放入两个列表中,然后循环遍历它:

# First order them in the order they appear in your weighted mean calculation
datamichaeldataewan <- rbind(datamichael,dataewan)
dataewandatamichael <- rbind(dataewan, datamichael)
datamichaeldatatom <- rbind(datamichael,datatom)
datatomdatamichael <- rbind(datatom, datamichael)

effmichaelewan <- dea(datamichaeldataewan$x,datamichaeldataewan$y)
effewanmichael <- dea(dataewandatatom$x,dataewandatatom$y)
effmichaeltom <- dea(datamichaeldatatom$x,datamichaeldatatom$y)
efftommichael <- dea(datatomdatamichael$x,datatomdatamichael$y)

# add them to lists
data.list <- list(datamichaeldataewan,dataewandatamichael,datamichaeldatatom,datatomdatamichael)
eff.list <- list(effmichaelewan,effewanmichael,effmichaeltom,efftommichael)

# your loop
for (i in seq(1,3,2)){ # use every other entry as you add plus one to include the following entry in your weighted mean calculation
  result1 <- (weighted.mean(eff(eff.list[[i]]), data.list[[i]]$y)/
                weighted.mean(eff(eff.list[[i+1]]), data.list[[i+1]]$y))
  print(result1)
}

【讨论】:

    猜你喜欢
    • 2021-08-31
    • 1970-01-01
    • 2022-01-14
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多