R语言for循环中filter()函数失效问题排查与修复求助
R代码过滤数据框统计全为0的原因及修复方案
问题重现
你编写的R代码意图遍历miRNA列表,过滤对应列值为"yes"的行,统计调控类型数量,但运行后结果全为0:
原始代码
miRNA.list <- c("let-7a-5p", "let-7a-1-3p", "let-7b-5p") summary.df <- data.frame() for (miRNA in miRNA.list) { temp.name <- miRNA temp.df <- df.mirna.pv %>% filter(`temp.name` == "yes") %>% summarise(downregulated = sum(str_count(status, "downregulated")), upregulated = sum(str_count(status, "upregulated")), all = n()) summary.df <- rbind(summary.df, temp.df) }
目标数据框df.mirna.pv
print(df.mirna.pv) let-7a-5p let-7a-1-3p let-7b-5p status Xkr4 no yes no upregulated Mrpl15 yes yes no downregulated Lypla1 yes yes yes downregulated Tcea1 no yes no not significant
错误输出
downregulated upregulated all 1 0 0 0 2 0 0 0 3 0 0 0
核心原因
问题出在filter(temp.name == "yes")这一行:
- dplyr中的反引号
`是用来引用字面列名的(比如列名带空格时),这里`temp.name`会被解析成名为temp.name的列,但你的数据框里根本不存在这个列,所以过滤后返回空数据框,后续统计自然全为0。 - 你实际需要的是引用变量
temp.name中存储的字符串对应的列,而不是字面意义上的temp.name列。
修复方案
这里提供两种dplyr兼容的修复写法,同时优化统计逻辑(用精确匹配替代字符串计数,更高效):
方法1:使用.data代词(推荐,dplyr 1.0.0+支持)
.data代词可以直接通过变量引用数据框的列:
miRNA.list <- c("let-7a-5p", "let-7a-1-3p", "let-7b-5p") summary.df <- data.frame() for (miRNA in miRNA.list) { temp.name <- miRNA temp.df <- df.mirna.pv %>% filter(.data[[temp.name]] == "yes") %>% summarise(downregulated = sum(status == "downregulated"), upregulated = sum(status == "upregulated"), all = n()) summary.df <- rbind(summary.df, temp.df) } # 给结果添加miRNA名称作为行名 rownames(summary.df) <- miRNA.list summary.df
方法2:使用rlang非标准求值
将字符串列名转为符号后注入表达式:
library(rlang) miRNA.list <- c("let-7a-5p", "let-7a-1-3p", "let-7b-5p") summary.df <- data.frame() for (miRNA in miRNA.list) { temp.name <- sym(miRNA) temp.df <- df.mirna.pv %>% filter(!!temp.name == "yes") %>% summarise(downregulated = sum(status == "downregulated"), upregulated = sum(status == "upregulated"), all = n()) summary.df <- rbind(summary.df, temp.df) } rownames(summary.df) <- miRNA.list summary.df
修复后正确输出
downregulated upregulated all let-7a-5p 1 0 2 let-7a-1-3p 2 1 4 let-7b-5p 1 0 1
内容的提问来源于stack exchange,提问作者Mauricio Oliveira
相关产品推荐
相关产品推荐

