首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用lapply和filter对具有已过滤的列名中的模式的数据进行子集

使用lapply和filter对具有已过滤的列名中的模式的数据进行子集
EN

Stack Overflow用户
提问于 2018-12-12 16:56:13
回答 2查看 2K关注 0票数 1
  • 与R合作*

我有一个由16个数据组成的列表,其中每个数据都对应于一个不同的年份。为了保持秩序,在创建这些dfs时,根据每个df的年份(例如,2002年df的区域字段称为"area_2",2003年为"area_3“),在每个专栏名称中添加了一个后缀。

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

我希望根据这些子集的可能字段创建子集列表,例如该字段所在的每个df的行或0。

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

代码语言:javascript
复制
subset <- lapply(df.list, function(x) dplyr::filter(x, fieldname == "1"))

然而,字段名在每个列表成员中有不同的名称,即"fieldname_2“、”fieldname_3“--一直到18 (跳过8)。

那么,问题是是否有一种简单的方法在列表中执行这个子设置,将函数设置为查找带有模式和不断变化的后缀的字段名。

用于实践过滤的虚拟示例:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-12 17:05:03

你可以这么做..。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-12-12 16:57:49

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53747832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档