R语言:循环提取指定列及含特定字符列的方案排障
R语言循环提取指定列的问题解决
原始数据
我们有如下R语言DataFrame:
df <- structure(list(date = c("2021-1-1", "2021-1-2", "2021-1-3", "2021-1-4", "2021-1-5", "2021-1-6"), buy_price_actual = 1:6, call_price_actual = 2:7, sell_price_actual = 3:8, buy_price_pred = 4:9, call_price_pred = 5:10, sell_price_pred = 6:11), class = "data.frame", row.names = c(NA, -6L))
需求是在for循环中提取date列,以及buy、sell对应的实际值和预测值列。以下是两种原始方法的问题分析及修正方案:
方法一:预定义列名列表循环提取(原代码bug修正)
原代码问题
原代码中select(col)直接传入字符向量,dplyr的select()默认使用非标准求值,会把字符向量当成变量名而非列名,导致报错。
修正后代码
cols <- list( c("date", "buy_price_actual", "buy_price_pred"), c("date", "sell_price_actual", "sell_price_pred") ) for (col in cols){ df1 <- df %>% select(all_of(col)) # 用all_of()包裹字符向量,明确指定按列名字符串提取 print(df1) }
方法二:通过正则匹配关键词提取(原代码bug修正)
原代码问题
grepl('date'|price_type, names(.))语法错误:|是正则表达式的或运算符,但这里错误地当成了R的逻辑或,需要将两个关键词拼接成正确的正则表达式。select_if()函数已被dplyr弃用,推荐使用更直观的select(matches())或select(where())。
修正后代码(方案一:用matches())
price_types <- c('buy', 'sell') for (price_type in price_types){ df1 <- df %>% select(matches(paste0('date|', price_type))) # 拼接正则表达式,匹配date或指定价格类型的列 print(df1) }
修正后代码(方案二:用where())
price_types <- c('buy', 'sell') for (price_type in price_types){ pattern <- paste0('date|', price_type) df1 <- df %>% select(where(~ grepl(pattern, cur_column()))) # 用cur_column()获取当前列名进行匹配 print(df1) }
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

