【问题标题】:r data.table usage of .SD with multiple column sets to get RMSPEr data.table 使用具有多列集的 .SD 来获得 RMSPE
【发布时间】:2018-06-04 09:09:12
【问题描述】:

我有一个数据集,我在其中做了一些预测。我现在想计算 RMSPE 并且为此我使用 MLmetrics 包,因为我通过输入预测和实际来了解我会得到 RMSPE。我多么困惑如何在 data.table 中使用它来传递 2 组列。

我的示例数据集如下所示 -

library(data.table)
library(MLmetrics)

set.seed(123)
id <- seq(1001,1100,1)
city <- sample(1:4,100,replace = T)
a1 <- sample(1:100,100,replace = T)
a2 <- sample(1:100,100,replace = T)
a3 <- sample(1:100,100,replace = T)
a4 <- sample(1:100,100,replace = T)
a5 <- sample(1:100,100,replace = T)
p1 <- sample(1:100,100,replace = T)
p2 <- sample(1:100,100,replace = T)
p3 <- sample(1:100,100,replace = T)
p4 <- sample(1:100,100,replace = T)
p5 <- sample(1:100,100,replace = T)

df1 <- as.data.table(data.frame(id,city,a1,a2,a3,a4,a5,p1,p2,p3,p4,p5))

RMSPE <- df1[, lapply(.SD, function(x,y) RMSPE(x,y),
                       by = city, .SDcols = **xxxx**)] 

所以在这种情况下,a1,a2,a3,a4,a5 是我的实际值,p1,p2,p3,p4,p5 是我的预测值。我想将 p1,p2,p3,p4,p5 作为 x 传递和 a1,a2,a3,a4,a5 作为 y。我期望的结果输出是一种汇总表,有 4 行(每个城市一个)和 6 列,第一个用于城市,第 2-6 列用于每个变量的 RMSPE。 p>

如何在 data.table 中获取此信息。我应该用什么替换 xxxx

谢谢!!

【问题讨论】:

  • @chinsoon12,这将创建 20 行和 2 个变量......我正在寻找 4 行和 6 个变量的输出
  • @chinsoon12,这给出了 4 行和 1 个 RMSPE 变量:(.....
  • @chinsoon12,感谢您的回答和建议。但是在我的实际数据中,变量名没有模式。我的意思是它们不以 1、2、3、4 等为后缀。因此,将它们存储在向量中可能是一种选择,例如实际 = c(a1、a2、a4、a4、a5) 和 pred = c( p1,p2,p3,p4,p5)(我需要为名称添加“”)......这就是我创建一个函数来传递两个向量但不知道如何传递它们的原因应用

标签: r data.table lapply


【解决方案1】:

我不确定这是不是你要找的东西

colsToKeep <- c("a1", "a2", "a3", "a4", "a5")
colsToW <- c("p1", "p2", "p3", "p4", "p5")


df1[, Map(function(x,y, w) get(x)(y, w), 
          setNames(rep('RMSPE',length(colsToKeep)), paste("RMSPE", colsToKeep, colsToW, sep = "_")),
          .SD[, ..colsToKeep], .SD[, ..colsToW]),
    by = city]  

【讨论】:

  • 感谢您的回答。这似乎适用于我的示例数据。注意 - 传递 colsTokeep 和 colsToW 的顺序应该交换。您能否确认 3 个参数 x、y、w 及其与 setNames() 的链接。 SetNames 中的第一个参数是否在 get(x) 中使用了 5 次“RMSPE”返回,而第二个参数形成了列标题。 .SD 是 y 和 w 的输入。所以最后 get(x)(y,w) 变成 RMSPE(colsTokeep,colsToW)......对吧?它如何为所有列做到这一点?
  • 是的。 setNames 有函数和列的名称,两个 SD 都有函数的参数,在这种特殊情况下是 y 和 w
  • 另一种选择:df1[, Map(function(x, y) RMSPE(get(x), get(y)), colsToW, colsToKeep), by=city]
  • @fidelin,谢谢!!
  • @chinsoon12,谢谢!!
猜你喜欢
  • 2015-11-23
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2015-04-17
  • 1970-01-01
  • 2012-08-14
相关资源
最近更新 更多