0

Trying to simplify and make my code reproducible, I have the following loop code which aims to subset a data frame and store every subsetting in a new variable:

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

I expected my loop to store every subsetting (4 subsettings) in a new variable called "type" and the corresponding string. Instead of it, I get the following error:

"Error in UseMethod("filter_") : no applicable method for 'filter_' applied to an object of class "c('double', 'numeric')"

I've already tried to modify the class of type coercing it to be a string through as.character(types) but got no success.

Edit: the output of head(NEI) is the following:

   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
rar
  • 894
  • 1
  • 9
  • 24
Mauro
  • 477
  • 1
  • 9
  • 22

1 Answers1

0

What you want to do is

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

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

This will give you 4 dataframes based on types

Trying this on mtcars dataset

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

and similarly other dataframes.

The reason why your solution does not work is because you are trying to assign values to characters which can be reproduced by doing

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

Error in UseMethod("filter_") : no applicable method for 'filter_' applied to an object of class "c('double', 'numeric')"

However, using assign is bad, as mentioned in comments you can use split which would give you list of dataframes.

new_data <- split(NEI, NEI$type)

and then access them by doing new_data[[1]], new_data[[2]] and so on.

Ronak Shah
  • 377,200
  • 20
  • 156
  • 213