我有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
答案 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.frame
和list
循环访问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