分享
三行代码  ›  专栏  ›  技术社区  ›  Sung Joo Lee

如何在循环filter()函数中使用colnames()后删除双引号

  •  0
  • Sung Joo Lee  · 技术社区  · 1 周前

    我想用 filter 函数从符合条件的数据帧中提取行。

    我的数据帧如下所示:

    head(EIA)
      length location  stype  rock  dist  ftype  depth aspect  degree  drain  TWI
    1   len1     loc3 stype2 rock3 dist3 ftype1 depth2   asp2 degree2 drain4 TWI1
    2   len4     loc2 stype2 rock3 dist1 ftype4 depth3   asp4 degree3 drain4 TWI3
    3   len2     loc2 stype2 rock2 dist1 ftype4 depth3   asp1 degree2 drain4 TWI2
    4   len4     loc2 stype2 rock3 dist2 ftype4 depth3   asp4 degree2 drain4 TWI2
    5   len4     loc2 stype1 rock3 dist1 ftype2 depth3   asp1 degree3 drain4 TWI2
    6   len4     loc3 stype2 rock2 dist1 ftype2 depth3   asp4 degree3 drain1 TWI2
    

    等等。总行数:10560

    但是,由于我试图在for循环中完成这项工作,所以filter函数中的每个元素都必须与变量(colcolcol、a a、bb、cc)一起传递:

     colcol
        [1] "length"   "location" "stype"    
     aa;bb;cc
        [1] "len1"
        [1] "loc2"
        [1] "stype1"
    

    我试着这样做过滤功能,但没有成功:

    filter(EIA, colcol[1] == aa & colcol[2] == bb & colcol[3] == cc)
    

    结果必须提取两行。我想这是因为colcol[1]元素周围有双引号。我试图用 as.symbol , as.name ,和 noquote 但功能不起作用。

    这个问题有什么解决办法吗?

    提前谢谢你。

    1 回复  |  直到 1 周前
        1
  •  0
  •   Ronak Shah    1 周前

    将其转换为符号,然后计算

    library(dplyr)
    filter(EIA,!!sym(colcol[1]) == aa & !!sym(colcol[2]) == bb & !!sym(colcol[3]) == cc)
    

    例如,当我们评估第一个条件时,我们得到

    filter(EIA, !!sym(colcol[1]) == aa)
    #  length location  stype  rock  dist  ftype  depth aspect  degree  drain  TWI
    #1   len1     loc3 stype2 rock3 dist3 ftype1 depth2   asp2 degree2 drain4 TWI1
    

    数据

    EIA <- structure(list(length = structure(c(1L, 3L, 2L, 3L, 3L, 3L), 
    .Label = c("len1", "len2", "len4"), class = "factor"), location = structure(c(2L, 
    1L, 1L, 1L, 1L, 2L), .Label = c("loc2", "loc3"), class = "factor"), 
    stype = structure(c(2L, 2L, 2L, 2L, 1L, 2L), .Label = c("stype1", 
    "stype2"), class = "factor"), rock = structure(c(2L, 2L, 
    1L, 2L, 2L, 1L), .Label = c("rock2", "rock3"), class = "factor"), 
    dist = structure(c(3L, 1L, 1L, 2L, 1L, 1L), .Label = c("dist1", 
    "dist2", "dist3"), class = "factor"), ftype = structure(c(1L, 
    3L, 3L, 3L, 2L, 2L), .Label = c("ftype1", "ftype2", "ftype4"
    ), class = "factor"), depth = structure(c(1L, 2L, 2L, 2L, 
    2L, 2L), .Label = c("depth2", "depth3"), class = "factor"), 
    aspect = structure(c(2L, 3L, 1L, 3L, 1L, 3L), .Label = c("asp1", 
    "asp2", "asp4"), class = "factor"), degree = structure(c(1L, 
    2L, 1L, 1L, 2L, 2L), .Label = c("degree2", "degree3"), class = "factor"), 
    drain = structure(c(2L, 2L, 2L, 2L, 2L, 1L), .Label = c("drain1", 
    "drain4"), class = "factor"), TWI = structure(c(1L, 3L, 2L, 
    2L, 2L, 2L), .Label = c("TWI1", "TWI2", "TWI3"), class = "factor")), 
    class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6"))
    
    colcol <- c("length",   "location", "dist")
    aa <- "len1"
    bb <- "loc2"
    cc <- "stype1"
    
        2
  •  1
  •   Tushar Lad    1 周前

    子集是此类问题的最佳解

     aa <- subset(EIA,EIA$lenght=='len1')
    

    上面的例子你可能会喜欢,简单而聪明的解决方案。 也可以使用and(&)条件提取行。

     aa <- subset(EIA,EIA$lenght=='len1' & EIA$location=='loc2')