在R中使用str_split()将单列拆分为两列的问题求助
问题分析与修正
你的代码主要存在3个问题:
- 列名拼写错误:原数据框的列名是
nome_completo,但你写的是complete_name,导致程序找不到目标列。 - 列表索引逻辑错误:
str_split(..., simplify=FALSE)返回的是长度等于数据框行数的列表,每个列表元素对应一行的拆分结果。你用[[1]]是取整个列表的第一行结果,而非对每行单独提取,会导致所有行复用第一行的拆分值,完全不符合需求。 - 参数写法不规范:
str_split的拆分次数参数应显式写n=2,虽然位置传参也能运行,但可读性较差。
修正后的代码(贴近原代码逻辑)
library(dplyr) library(stringr) df %>% mutate( # 提取每行拆分结果的第一个元素作为名字 first_name = sapply(str_split(nome_completo, " ", simplify = FALSE, n = 2), `[`, 1), # 提取每行拆分结果的第二个元素作为姓氏 second_name = sapply(str_split(nome_completo, " ", simplify = FALSE, n = 2), `[`, 2) )
更简洁的写法(仍满足simplify=FALSE要求)
如果不想重复调用str_split,可以先把拆分结果存为临时列,再提取:
df %>% mutate( split_fullname = str_split(nome_completo, " ", simplify = FALSE, n = 2), first_name = sapply(split_fullname, `[`, 1), second_name = sapply(split_fullname, `[`, 2), # 可选:删除临时列 split_fullname = NULL )
逻辑说明
str_split(..., simplify=FALSE)返回的列表中,每个元素是对应行拆分后的字符向量(比如第一行是c("John", "Smith"))。- 用
sapply遍历这个列表,对每个向量提取第1/2个元素,最终得到对应列的字符向量,正好匹配数据框的行数。
内容的提问来源于stack exchange,提问作者Laura
相关产品推荐
相关产品推荐

