R: ошибка при попытке цикла с функцией фильтра dplyr - PullRequest
0 голосов
/ 02 января 2019

Пытаясь упростить и сделать мой код воспроизводимым, у меня есть следующий код цикла, который предназначен для поднабора фрейма данных и сохранения каждого поднабора в новой переменной:

types <- c("POINT", "NONPOINT", "ON-ROAD", "NON-ROAD")

for (i in seq_along(types)) {
   paste("type", types[i], sep = "") <- filter(NEI$Emissions, NEI$type == types[i])
}

Я ожидал, что мой цикл будет хранить каждыйподмножество (4 подмножества) в новой переменной с именем «type» и соответствующей строке.Вместо этого я получаю следующую ошибку:

"Ошибка в UseMethod (" filter_ "): нет применимого метода для 'filter_', примененного к объекту класса" c ('double', 'numeric ') "

Я уже пытался изменить класс типа, приведя его к строке через as.character(types), но безуспешно.

Редактировать: выводhead(NEI) является следующим:

   fips      SCC  Pollutant Emissions  type year
4  09001 10100401  PM25-PRI    15.714 POINT 1999
8  09001 10100404  PM25-PRI   234.178 POINT 1999
12 09001 10100501  PM25-PRI     0.128 POINT 1999
16 09001 10200401  PM25-PRI     2.036 POINT 1999
20 09001 10200504  PM25-PRI     0.388 POINT 1999
24 09001 10200602  PM25-PRI     1.490 POINT 1999

1 Ответ

0 голосов
/ 02 января 2019

То, что вы хотите сделать, это

types <- c("POINT", "NONPOINT", "ON-ROAD", "NON-ROAD")

for (i in types) {
  assign(paste0("type", i), filter(NEI, NEI$type == i))
}

Это даст вам 4 кадра данных на основе types

Попытка этого на mtcars наборе данных

cyl <- unique(mtcars$cyl)

for (i in cyl) {
  assign(paste0("type", i), filter(mtcars, mtcars$cyl == i))
}

type6
#   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#3 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#4 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#5 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#6 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
#7 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6

и аналогично другим фреймам данных.

Причина, по которой ваше решение не работает, заключается в том, что вы пытаетесь присвоить значения символам, которые можно воспроизвести, выполнив

paste0("type", types[1]) <- filter(mtcars$mpg, mtcars$cyl == 4)

Ошибка вUseMethod ("filter_"): нет применимого метода для 'filter_', примененного к объекту класса "c ('double', 'numeric')"

Однако с использованием assignплохо , как уже упоминалось в комментариях, вы можете использовать split, что даст вам список данных.

new_data <- split(NEI, NEI$type)

, а затем получить к ним доступ, выполнив new_data[[1]], new_data[[2]] и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...