使用lapply和filter来过滤带有已过滤列中的模式的子数据集

时间:2018-12-12 16:56:14

标签: r dataframe filter dplyr

  • 使用R *

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

在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

2 个答案:

答案 0 :(得分: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的列,并将其用于过滤-不管它们在数据框中的位置如何。

答案 1 :(得分:0)

由于列名不同,在通过data.framelist循环访问lapply后,使用索引来对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

ClassB