【问题标题】:R data.table dynamically filter rows based on columns in jR data.table 根据 j 中的列动态过滤行
【发布时间】:2018-11-21 15:21:47
【问题描述】:

我正在处理一个需要为少数预测变量生成 MAPE 的要求。为此,我使用 MAP 函数在 data.table 中生成带有 MAPE 值的汇总表。所以结果输出应该有 4 行 x 6 列,每个城市 1 行和 1 个城市列,后跟 a1、a2、a3、a4、a5,每个单元格中都有 MAPE 值。

以下是我使用的示例数据和代码(注意 - 考虑 a1,a2,a3....作为实际和 p1,p2,p3...作为预测)-

library(data.table)

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))


sum1 <- df1[, Map(function(x,y) mean(as.numeric(abs(get(x)-get(y))/get(x))*100),
                                                                   paste("a",1:5, sep = ""),
                                                                   paste("p",1:5, sep = "")),by=city]

现在我想为 x==y 然后 x &gt; yx &lt; y..... 的行生成相同的摘要,我认为最简单的方法是将它传递给 i 但是怎么做我没有得到.....当我尝试将它作为function(x,y) get(x)==get(y) 传递时它给出了错误

i 尚未计算为逻辑、整数或双精度

请推荐

【问题讨论】:

    标签: r filter data.table lapply map-function


    【解决方案1】:

    更新答案:由于您希望每个 ==&gt;&lt; 有 3 个单独的数据表,因此我使用 lapply 来一一处理这些操作与您在帖子中发布的代码相同。

    运算符(例如==)作为z 传递给Map。由于这是一个“运算符”,因此您不能使用get(z),因此为了解决此问题,我使用do.callfn 函数(即== 运算符)应用于变量列表。

    Map 函数中,我首先根据fn 值(即z)将数据过滤为x1y1。然后对这些子集应用 MAPE 公式得到最终结果。

    lapply(c("==", ">", "<"), 
           function(z) df1[, 
                           Map(function(x, y, fn = z){
                             x1 <- get(x)[do.call(fn, list(get(x), get(y)))]
                             y1 <- get(y)[do.call(fn, list(get(x), get(y)))]
                             mean(as.numeric(abs(x1 - y1) / x1) * 100)
                             },
                             paste0("a", 1:5),
                             paste0("p", 1:5),
                             z), 
                           by = city])
    

    【讨论】:

    • 感谢您的回答。这非常接近,但不会动态更新过滤。我一直在寻找类似的东西,使用符号列创建类似于从我的代码生成的摘要输出。因此,例如过滤 sign == "eq" 的行并获得一个汇总表。然后过滤带有符号 == "lt" 的行并生成汇总表。我希望代码动态执行此行过滤。目前,我们必须创建此列符号,然后使用 DT 作为另一个 data.table 的输入并进行过滤。过滤应该是动态完成的。
    • 我不确定我在这方面是否完全支持你,但请查看更新后的答案。
    • 感谢您的更新。请允许我再次解释一下。基本上需要计算 MAPE,类似于我在代码中的内容(或其他更好的方法)。现在需要为=&lt;&gt; 的行的每个预测变量分别计算这些 MAPE,因此需要动态过滤行并且需要计算 MAPE。所以最后我会有 3 组 MAPE 值来查看和比较。希望这可以澄清。
    • 感谢您的回答。这个最新的更新似乎起到了作用。需要您帮助了解它是如何工作的。基本上是函数(z),因为您正在调用 data.table 并使用 Map 函数,并且在其中您传递 fn = z 然后使用 do.call 传递.....我很想了解它是如何执行的和流量。请通过分享一些解释来帮助。我相信它会帮助所有看到你编写的有趣代码的用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多