【问题标题】:using lapply and filter to subset dataframes with a pattern in the filtered columname使用 lapply 和 filter 以过滤列名称中具有模式的子集数据帧
【发布时间】:2019-05-13 20:12:31
【问题描述】:
  • 使用 R *

我有一个包含 16 个数据框的列表,其中每个数据框对应不同的年份。为了保持秩序,我在创建这些 df 时,根据每个 df 的年份给每个 columname 添加了后缀(例如 2002 年 df 的 area 字段称为“area_2”,2003 年称为“area_3”。

在 DF 的列中,有一个字段具有两个可能的值(0 或 1,作为 True 或 False 的表示)。

我想根据这些子集的可能字段创建子集列表,例如该字段为 1 或 0 的每个 df 的行。

如果所有字段都以相同的方式命名,我可以使用以下行:

subset <- lapply(df.list, function(x) dplyr::filter(x, fieldname == "1"))

但是,字段名称在每个列表成员中的名称不同,分别为“fieldname_2”、“fieldname_3”——一直到 18(跳过 8)。

那么,问题是是否有一种直接的方法来执行这个子集,在列表中,设置函数来查找具有模式和变化后缀的字段名。

练习过滤的虚拟示例:

valuesx <- c(1,4,3,1,2,5,6,4)
valuesy <- c(4,3,7,1,8,5,2,1)

column_2 <- c(1,1,1,1,0,0,0,0)
column_3 <- c(1,0,1,1,0,0,1,0)

df1<- data.frame(value = valuesx, column_2 = column_2)
df2<- data.frame(value = valuesy, column_3 = column_3)

list_df <- list(df1, df2)

期望的结果:一个新列表,其中包含每个 DF 的行,其中 "column*"==1

【问题讨论】:

    标签: r dataframe filter dplyr


    【解决方案1】:

    你可以这样做...

    lapply(list_df,function(x) x[x[,grep("column",names(x))]==1,])
    
    [[1]]
      value column_2
    1     1        1
    2     4        1
    3     3        1
    4     1        1
    
    [[2]]
      value column_3
    1     4        1
    3     7        1
    4     1        1
    7     2        1
    

    grep 查找名称中包含文本 column 的列,并将它们用于过滤 - 无论它们在数据框中的什么位置。

    【讨论】:

      【解决方案2】:

      由于列名不同,在使用lapply 循环遍历list 后,使用索引对data.frames 进行子集化

      new_listdf <- lapply(list_df, function(x) x[x[[2]] == 1, ])
      new_listdf
      #[[1]]
      #  value column_2
      #1     1        1
      #2     4        1
      #3     3        1
      #4     1        1
      
      #[[2]]
      #  value column_3
      #1     4        1
      #3     7        1
      #4     1        1
      #7     2        1
      

      或者另一个选项是tidyverse

      library(tidyverse)
      list_df %>% 
           map(~ .x %>% 
                   filter_at(vars(matches('column')), any_vars(. == 1)))
      #[[1]]
      #  value column_2
      #1     1        1
      #2     4        1
      #3     3        1
      #4     1        1
      
      #[[2]]
      #  value column_3
      #1     4        1
      #2     7        1
      #3     1        1
      #4     2        1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-08
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 2020-06-27
        • 2019-12-30
        相关资源
        最近更新 更多