R语言替换数据框列docked_bike值为classic_bike报错求助
问题说明
现有R语言数据框data,其中列rideable_type包含三类取值:docked_bike、classic_bike、electric_bike,需求是将该列所有取值为docked_bike的记录统一替换为classic_bike。
原有尝试的代码及问题:
- 第一段代码使用
set_names()函数,该函数作用是为对象设置名称属性,无法修改向量内部的取值,因此运行后无任何变更:
data$rt<-data$rideable_type %>% set_names(~stringr::str_replace_all(".","docked_bike", "classic_bike"))
- 第二段代码使用
dplyr::rename_all()函数,该函数作用是修改数据框的列名,要求输入必须为数据框对象,传入的data$rideable_type是字符型向量,因此抛出如下错误;同时代码中str_replace_all参数顺序错误,未正确传入待处理对象:
data$rt<-data$rideable_type %>% dplyr::rename_all(~stringr::str_replace_all(".","docked_bike", "classic_bike"))
Error in UseMethod("tbl_vars") :
no applicable method for 'tbl_vars' applied to an object of class "character"
正确实现方式
以下几种写法都可以实现需求,按需选择即可:
1. 基础R原生写法(无需加载第三方包)
直接通过逻辑索引定位目标值替换,运行效率最高:
# 直接修改原rideable_type列 data$rideable_type[data$rideable_type == "docked_bike"] <- "classic_bike" # 如果需要保留原列,将结果赋值给新列rt即可 data$rt <- data$rideable_type data$rt[data$rt == "docked_bike"] <- "classic_bike"
2. dplyr + stringr 管道操作写法
适合在tidyverse工作流的代码中使用:
library(dplyr) library(stringr) data <- data %>% mutate( # 新建rt列存储替换后的结果,要覆盖原列就把等号左边改成rideable_type rt = str_replace_all(rideable_type, pattern = "docked_bike", replacement = "classic_bike") )
3. dplyr::recode 精确值替换写法
比通用字符串匹配替换更严谨,仅完全匹配目标取值的记录才会被替换,避免误替换包含相同关键词的其他值:
library(dplyr) data <- data %>% mutate( rt = recode(rideable_type, "docked_bike" = "classic_bike") )
内容的提问来源于stack exchange,提问作者Douwe
相关产品推荐
相关产品推荐

