如何用R语言基于同一条件批量筛选多个数据框的子集?
批量筛选多个数据框的正确方法
问题背景
现有三个数据框dm6、mm10、hg38,结构示例如下(以dm6为例):
head(dm6) chr txStart txEnd strand geneName refGeneName geneLength 1 chr3L 19751440 19793319 - CG42637 NM_001007095 41877 2 chr2L 870714 876537 + PNUTS NM_001014453 5824 3 chr2L 871344 873648 + PNUTS NM_001014454 2305 4 chr2L 870714 873648 + PNUTS NM_001014455 2935 5 chr2L 1792557 1793018 - Gr22b NM_001014456 462 6 chr2L 1997602 2006063 - CG33543 NM_001014458 8462 gbRPK_NHS gbRPK_HS20 FC_HS20_vs_NHS log2FC_HS20_vs_NHS 1 685.348600 282.196300 0.4117558 -1.2801390 2 4466.123000 838.157600 0.1876701 -2.4137290 3 6268.892000 1036.923000 0.1654077 -2.5959010 4 6723.241000 1176.968000 0.1750596 -2.5140820 5 4.329004 2.164502 0.5000000 -1.0000000 6 12.455380 14.105770 1.1325050 0.1795171 dRPK_HS20_vs_NHS Regulation pVal_DESeq2_HS20_vs_NHS 1 -403.152400 DownHC 4.247334e-02 2 -3627.965000 DownHC 5.838478e-05 3 -5231.969000 DownHC 1.866207e-05 4 -5546.273000 DownHC 2.595508e-05 5 -2.164502 UnReg 7.866483e-01 6 1.650396 UnReg 9.002195e-01
需求是批量筛选出每个数据框中Regulation列值为"UpHC"的行,避免逐个调用subset。
用户尝试了以下方法但失败:
# 错误的列表创建方式 df <- c("dm6"=dm6, "mm10"=mm10, "hg38"=hg38) # 错误的lapply调用 df_up <- lapply(df, subset, df[grepl("Regulation", names(df))] == "UpHC")
得到的结果是拆分后的空向量列表,不符合预期。
错误原因
用c()组合数据框会把每个数据框拆成单独的列向量,生成的不是数据框列表,而是一个包含所有列的大列表,这导致后续lapply遍历的是单个列而非整个数据框。
正确解决方案
步骤1:创建正确的数据框列表
用list()而非c()来组合数据框,这样每个元素都是完整的数据框:
df_list <- list(dm6 = dm6, mm10 = mm10, hg38 = hg38)
步骤2:用lapply批量筛选
有两种常用方法:
方法1:使用subset函数
在lapply中直接指定筛选条件,subset会自动识别每个数据框的列:
df_up <- lapply(df_list, subset, Regulation == "UpHC")
方法2:使用索引筛选(更直观)
如果习惯用数据框索引的方式,也可以写匿名函数:
df_up <- lapply(df_list, function(x) x[x$Regulation == "UpHC", ])
步骤3:(可选)将筛选结果放回全局环境
如果需要把每个筛选后的子集单独作为变量(比如dm_up、mm_up、hg_up),可以用list2env:
# 先给列表元素重命名为目标变量名 names(df_up) <- paste0(names(df_up), "_up") # 放入全局环境 list2env(df_up, envir = .GlobalEnv)
这样就完成了批量筛选,df_up是包含三个筛选后数据框的列表,或者直接得到三个单独的子集变量。
内容的提问来源于stack exchange,提问作者PowerPuffen
相关产品推荐
相关产品推荐

