如何结合lapply与relocate函数批量调整数据框列位置?
批量用
lapply移动数据框id列至最前的正确方法 场景说明
已创建包含4个数据框的列表:
dfs <- list(bio_w, bio_k, demo_w, demo_k)
手动逐个将每个数据框的id列移至最前的代码如下(注:原代码中bio_k的处理写错为bio_w,已修正):
bio_w <- bio_w %>% relocate(id, .before = 1) bio_k <- bio_k %>% relocate(id, .before = 1) demo_w <- demo_w %>% relocate(id, .before = 1) demo_k <- demo_k %>% relocate(id, .before = 1)
错误尝试与对应报错
尝试用lapply批量操作时多次触发报错,错误代码及对应提示如下:
错误代码1
dfs2 <- lapply(dfs, FUN = function(x){x[relocate(id, .before = 1)]})
Error in UseMethod("relocate") :
no applicable method for 'relocate' applied to an object of class "character"
错误代码2
dfs2 <- lapply(dfs %>% relocate(id, .after = 0))
Error in lapply(dfs %>% relocate(id, .after = 0)) :
argument "FUN" is missing, with no default
错误代码3
dfs2 <- lapply(dfs, function(x) relocate(id, .after = 0))
Error in UseMethod("relocate") :
no applicable method for 'relocate' applied to an object of class "function"
正确解法
方法1:lapply结合dplyr::relocate
relocate是dplyr专属函数,必须针对每个列表内的数据框(即lapply循环中的x)调用,两种写法均可:
library(dplyr) # 写法1:用管道符传递数据框 dfs2 <- lapply(dfs, function(x) { x %>% relocate(id, .before = 1) }) # 写法2:直接将数据框作为relocate的第一个参数 dfs2 <- lapply(dfs, function(x) { relocate(x, id, .before = 1) })
方法2:purrr::map(tidyverse风格替代方案)
如果习惯使用tidyverse工具链,purrr::map可以替代lapply,写法更简洁:
library(purrr) library(dplyr) dfs2 <- map(dfs, ~ .x %>% relocate(id, .before = 1))
错误原因解析
- 错误代码1/3:未将循环中的数据框
x传入relocate,直接调用relocate(id,...)会让函数把id识别为字符向量/无效对象,无法匹配数据框类型的处理方法。 - 错误代码2:
relocate仅支持单个数据框,不能直接作用于列表;同时lapply必须指定FUN参数,缺少该参数触发第二个报错。
内容的提问来源于stack exchange,提问作者Steven Haworth
相关产品推荐
相关产品推荐

