我有一个由16个数据组成的列表,其中每个数据都对应于一个不同的年份。为了保持秩序,在创建这些dfs时,根据每个df的年份(例如,2002年df的区域字段称为"area_2",2003年为"area_3“),在每个专栏名称中添加了一个后缀。
在DF的列中,有一个字段有两个可能的值(0或1,表示为True或False)。
我希望根据这些子集的可能字段创建子集列表,例如该字段所在的每个df的行或0。
如果所有字段都以相同的方式命名,我可以使用以下行:
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行的新列表,其中包含“==1*”==1
发布于 2018-12-12 17:05:03
你可以这么做..。
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 1grep查找列的名称,包括文本column,并将它们用于筛选--而不管它们在数据帧中的位置。
发布于 2018-12-12 16:57:49
由于列名不同,在使用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 1https://stackoverflow.com/questions/53747832
复制相似问题