如何用dplyr实现类似mutate_any的功能?处理含不存在列的列名列表
解决方案
要实现仅转换数据框中存在的指定列为数值型,可以先筛选出列名列表里与数据框实际列名的交集,再执行转换操作。
方法1:使用mutate_at(兼容旧版tidyverse)
先通过intersect()提取有效列名,再传入mutate_at:
df <- data.frame('a'=c('1','2','3'), 'b'=c('1','2','3'), 'c'=c(1,2,3), 'd'=c('1','2','3')) col_names=c('a','b','frog') # 筛选出数据框中存在的列 valid_cols <- intersect(col_names, colnames(df)) # 仅转换有效列 df |> mutate_at(valid_cols, as.numeric)
方法2:使用mutate(across())(tidyverse新版本推荐)
新版本tidyverse更推荐用across()替代mutate_at,写法更简洁:
df |> mutate(across(intersect(col_names, colnames(df)), as.numeric))
原理说明
intersect(col_names, colnames(df))会自动找出同时出现在指定列名列表和数据框列名中的元素,自动忽略不存在的列(比如示例中的frog),确保后续转换操作只针对存在的列执行,避免报错。
内容的提问来源于stack exchange,提问作者Justin Beresford
相关产品推荐
相关产品推荐

