R data.table根据j中的列动态筛选行
我正在处理一个需要为几个预测变量生成MAPE的需求。为此,我使用MAP函数在data.table中生成一个包含MAPE值的汇总表。因此,结果输出应该有4行x 6列,每个城市1行,1个城市列,后跟每个单元格中具有MAPE值的a1、a2、a3、a4、a5 下面是我使用的示例数据和代码(注意-将a1、a2、a3…视为实际数据,将p1、p2、p3…视为预测数据)-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个独立的数据表,谢谢您的回答。这非常接近,但不会
库(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])