使用R语言mutate+strsplit创建新变量结果不符合预期的问题求助
问题:dplyr mutate中使用strsplit后所有行重复第一行结果的原因及解决办法
我尝试用dplyr的mutate函数,对dataframe的filename列调用strsplit做字符串分割,创建LotCode和ModelName两个新变量,但运行后所有行的新变量值都是第一行的结果,没法得到每行对应的正确分割值。
代码示例:
myDF = data.frame(filename = c("T9719178_Mazda_20230415", "T9719179_Mazda_20230415", "T9719180_Mazda_20230415", "T9719001_Tesla_20230415", "T9719002_Tesla_20230415", "T9719003_Tesla_20230415")) myDF%>% mutate(LotCode = as.factor(strsplit(filename,"_",fixed=TRUE)[[1]][1]))%>% mutate(ModelName = as.factor(strsplit(filename,"_",fixed=TRUE)[[1]][2]))
当前输出所有行的LotCode都是T9719178、ModelName都是Mazda,期望每行对应分割后的正确值,问题出在哪?
原因分析
strsplit函数接收向量输入时,会返回一个列表,列表里每个元素对应原向量中每行的分割结果。你代码里用[[1]]直接提取了列表的第一个元素(也就是第一行filename分割后的结果),然后mutate会把这个单一值循环填充到所有行,所以所有行都显示第一行的分割值。
解决办法
方法1:用purrr的map函数处理strsplit返回的列表
借助purrr包的map_chr函数,逐个提取列表中每个元素的对应位置:
library(dplyr) library(purrr) myDF = data.frame(filename = c("T9719178_Mazda_20230415", "T9719179_Mazda_20230415", "T9719180_Mazda_20230415", "T9719001_Tesla_20230415", "T9719002_Tesla_20230415", "T9719003_Tesla_20230415")) myDF %>% mutate( LotCode = as.factor(map_chr(strsplit(filename, "_", fixed=TRUE), 1)), ModelName = as.factor(map_chr(strsplit(filename, "_", fixed=TRUE), 2)) )
方法2:用tidyr的separate函数(更简洁)
tidyr包的separate是专门用于分割列的函数,语法更直观,不需要手动处理列表:
library(dplyr) library(tidyr) myDF %>% separate(filename, into = c("LotCode", "ModelName", "Date"), sep = "_") %>% mutate(across(c(LotCode, ModelName), as.factor))
这里into参数指定分割后生成的列名,sep指定分隔符,最后用across批量转换为因子类型。
内容的提问来源于stack exchange,提问作者BharatAyya
相关产品推荐
相关产品推荐

