R语言使用循环或apply族批量生成子集dataframe:按同后缀列无NA筛选
R语言按后缀匹配筛选数据框解决方案
原代码核心问题
assign函数调用参数错误,无法生成带指定后缀的独立数据框变量- 动态取列时用
$运算符拼接下标的写法不符合R语法,会被识别为取date/salary列的第i个元素,而非名字为datei/salaryi的整列数据
修正后可直接运行的代码
employee <- c('John Doe','Peter Gynn','Jolie Hope') salary1 <- c(NA, 20400, 26800) salary2 <- c(29045, NA, 78765) date1 <- as.Date(c(NA,'2008-3-25','2007-3-14')) date2 <- as.Date(c('2010-11-1',NA,'2007-3-14')) employ.data <- data.frame(employee, salary1, salary2, date1, date2) # 循环生成对应子集 for (i in 1:2) { # 动态拼接当前需要校验的列名 salary_col <- paste0("salary", i) date_col <- paste0("date", i) # 筛选两列均无NA的行 sub_df <- subset(employ.data, !is.na(employ.data[[salary_col]]) & !is.na(employ.data[[date_col]])) # 生成独立的子集变量 assign(paste0("employ.data", i), sub_df) }
运行后直接调用employ.data1和employ.data2即可得到你期望的输出结果。
通用扩展方案
如果后续需要校验的变量前缀、后缀范围有变化,可以用以下扩展性更强的写法:
# 自定义需要校验非空的变量前缀、后缀范围 check_prefix <- c("salary", "date") suffix_range <- 1:2 for (i in suffix_range) { check_cols <- paste0(check_prefix, i) # 统计每行校验列的NA数量,为0则代表所有校验列均无NA keep_rows <- rowSums(is.na(employ.data[, check_cols])) == 0 sub_df <- employ.data[keep_rows, ] assign(paste0("employ.data", i), sub_df) }
内容的提问来源于stack exchange,提问作者adamrowe16495
相关产品推荐
相关产品推荐

