如何使用dplyr拆分数据框并重新绑定列
使用dplyr高效拆分并列绑定数据框
首先纠正原代码的一个小问题:str_detect属于stringr包,不是string包,加载包时应该写library(stringr)。
下面是用dplyr实现需求的更高效写法,链式语法可读性更强,也更适配tidyverse生态:
基础实现版本
library(dplyr) library(stringr) new <- mtcars %>% # 筛选am为0的行,取前13行所有列 filter(str_detect(as.character(am), "0")) %>% slice(1:13) %>% # 绑定am为1的行的第9-11列 bind_cols( mtcars %>% filter(str_detect(as.character(am), "1")) %>% select(9:11) )
更高效的简化版
由于am是数值型变量,直接用数值判断比字符串检测更快,可简化为:
library(dplyr) new <- mtcars %>% filter(am == 0) %>% slice(1:13) %>% bind_cols( mtcars %>% filter(am == 1) %>% select(9:11) )
封装成可复用函数
如果需要多次复用这个逻辑,可以封装成函数,参数化控制筛选条件、行范围和列范围:
library(dplyr) split_and_bind <- function(df, filter_col, val1, val2, rows_range, cols_range) { part1 <- df %>% filter({{filter_col}} == val1) %>% slice(rows_range) part2 <- df %>% filter({{filter_col}} == val2) %>% select(cols_range) bind_cols(part1, part2) } # 调用示例 new <- split_and_bind(mtcars, am, 0, 1, 1:13, 9:11)
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

