R data.table根据j中的列动态筛选行

R data.table根据j中的列动态筛选行,r,filter,data.table,lapply,map-function,R,Filter,Data.table,Lapply,Map Function,我正在处理一个需要为几个预测变量生成MAPE的需求。为此,我使用MAP函数在data.table中生成一个包含MAPE值的汇总表。因此,结果输出应该有4行x 6列,每个城市1行,1个城市列,后跟每个单元格中具有MAPE值的a1、a2、a3、a4、a5 下面是我使用的示例数据和代码(注意-将a1、a2、a3…视为实际数据,将p1、p2、p3…视为预测数据)- 库(data.table) 种子集(123) id更新的答案:由于您希望为==,&分别设置3个独立的数据表,谢谢您的回答。这非常接近,但不会

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

下面是我使用的示例数据和代码(注意-将a1、a2、a3…视为实际数据,将p1、p2、p3…视为预测数据)-

库(data.table)
种子集(123)

id更新的答案:由于您希望为
==
&
分别设置3个独立的数据表,谢谢您的回答。这非常接近,但不会动态更新筛选。我想要的是,使用符号列创建摘要输出,类似于从我的代码生成的输出。例如,过滤行中的sign==“eq”并得到一个汇总表。然后用符号==“lt”筛选行并生成汇总表。这是我希望代码动态执行的行过滤。目前,我们必须创建这个列符号&然后使用DT作为另一个data.table的输入并进行过滤。过滤应该是动态完成的。我不确定我是否完全同意你的这一部分,但看到更新的答案。谢谢你的更新。请允许我再解释一遍。基本上,需要计算MAPE,类似于我在代码中所做的(或者其他更好的方法)。现在需要分别为
=
行的每个预测变量计算这些MAPE,因此需要动态地进行行过滤,并且需要计算MAPE。因此,最后我将有3组MAPE值要查看和比较。希望这能澄清。谢谢你的回答。这一最新更新似乎正在发挥作用。需要你的帮助来了解它是如何工作的。基本上是函数(z),因为您正在调用data.table并使用Map函数,并且在其中传递fn=z,然后使用do.call…..传递它。。。。。我很想了解它是如何执行的以及流程。请帮忙分享一些解释。我相信它会帮助所有用户,他们会看到您编写的这段有趣的代码。
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]
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])