代码之家  ›  专栏  ›  技术社区  ›  Mauro

r:尝试使用dplyr过滤器函数执行循环时出错

  •  0
  • Mauro  · 技术社区  · 6 年前

    为了简化代码并使其可重复,我使用了以下循环代码,其目的是将数据帧子集并将每个子集存储在一个新变量中:

    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_uuu“): “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 回复  |  直到 6 年前
        1
  •  0
  •   Ronak Shah    6 年前

    你想做的是

    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_uu”)中的错误: “filter”没有适用于“c”(double,“numeric”)类的对象的方法。

    然而, using assign is bad ,如评论中所述,您可以使用 split 它会给你数据帧列表。

    new_data <- split(NEI, NEI$type)
    

    然后通过 new_data[[1]] , new_data[[2]] 等等。