在dplyr::filter函数中使用paste0出现0行结果问题求助
问题原因及解决办法
你的代码返回0行是因为直接拿字符串和数值做比较:paste0(Pval_time_hours)生成的是字符串"Pval_time_hours8h",R会把0.05转换成字符串后按字符顺序对比,结果全为FALSE,所以filter没有筛选出任何行。
下面是三种可行的解决方式:
方法1:使用.data pronoun引用列
这是dplyr推荐的通过字符串引用列的方式,简洁直观:
sig_time_hours_results1 <- data.frame (ID = c("value_1", "value_2", "value3", "value4"), Pval_time_hours8h = c(1.00, 0.005, 0.006, 0.2) ) hour = "8h" Pval_time_hours <- paste0("Pval_time_hours", hour) sig_time_hours_results2 <- dplyr::filter(sig_time_hours_results1, .data[[Pval_time_hours]] < 0.05)
方法2:结合across函数
适合需要同时处理多列的场景,单列也适用:
sig_time_hours_results2 <- dplyr::filter(sig_time_hours_results1, across(all_of(Pval_time_hours), ~ .x < 0.05))
方法3:使用rlang的非标准求值
通过把字符串转换成符号再求值,是常用的动态列引用方式:
library(rlang) sig_time_hours_results2 <- dplyr::filter(sig_time_hours_results1, !!sym(Pval_time_hours) < 0.05)
运行以上任意一种方法,都会得到预期的2行结果:
ID Pval_time_hours8h 1 value_2 0.005 2 value3 0.006
内容的提问来源于stack exchange,提问作者Batsi-2015
相关产品推荐
相关产品推荐

