在R中如何基于迭代Flag_Posbefored列筛选测试数据集?
问题原因
你循环里用!!name时,name是字符串类型,而!!只能解析符号对象,无法直接把字符串转换成数据框的列名。这导致你的筛选条件实际是在判断字符串等于0或为NA,自然返回空数据框。
解决方法
方法1:将字符串转为符号后引用
用rlang::sym()把拼接出的列名字符串转换成符号,再用!!注入筛选条件:
library(dplyr) library(rlang) # 用列表存储各时间段结果,避免循环覆盖 result_list <- list() for(i in 1:81){ name_sym <- sym(paste("Flag_Posbefored", i, sep="")) current_result <- Dates_try %>% filter( TestDate >= Testing_Dates$Start.Date[i], TestDate <= Testing_Dates$End.Date[i], (!!name_sym == 0 | is.na(!!name_sym)) ) result_list[[i]] <- current_result }
方法2:使用.data代词(更简洁)
dplyr提供的.data代词可直接通过字符串引用列,无需转换符号:
library(dplyr) result_list <- list() for(i in 1:81){ name <- paste("Flag_Posbefored", i, sep="") current_result <- Dates_try %>% filter( TestDate >= Testing_Dates$Start.Date[i], TestDate <= Testing_Dates$End.Date[i], (.data[[name]] == 0 | is.na(.data[[name]])) ) result_list[[i]] <- current_result }
额外提示
原代码中每次循环都将结果赋值给PerPos_1,会覆盖之前的结果。建议用列表result_list存储各时间段的筛选结果,后续可通过result_list[[1]]、result_list[[2]]等调用对应周的数据。
内容的提问来源于stack exchange,提问作者Almoss277
相关产品推荐
相关产品推荐

