R data.table динамически фильтрует строки на основе столбцов в j - PullRequest
0 голосов
/ 12 июня 2018

Я работаю над требованием, когда мне нужно сгенерировать MAPE для нескольких прогнозируемых переменных.Для этого я использую функцию MAP для генерации сводной таблицы со значениями MAPE в data.table .Таким образом, результат вывода должен иметь 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 > y и x < y ..... и самый простой способ сделать это, как мне кажется, это передатьэто в i , но как это сделать, что я не получаю ..... когда я пытаюсь передать его как function(x,y) get(x)==get(y), выдает ошибку

я не оценилк логическому, целому или двойному

Пожалуйста, предложите

1 Ответ

0 голосов
/ 12 июня 2018

Обновленный ответ: Поскольку вы хотите иметь 3 отдельные таблицы данных для каждой ==, > & <, я использовал lapply для обработки этих операций одна за другой, используятот же код, который вы опубликовали в своем сообщении.

Оператор (например, ==) передается Map как z.Поскольку это «оператор», вы не можете использовать get(z), поэтому для решения этой проблемы я использовал do.call, чтобы применить функцию fn (т.е. оператор ==) к списку переменных.

В функции Map я сначала отфильтровал данные на основе значения fn (т.е. z) как x1 & y1.Затем к этим подмножествам применяется формула 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])
...