R语言中拆分字符长度不均的单列数据为三列的问题
解决方案
你的问题出在使用固定位置sep=-6拆分,而pack列的长度不一致(30kg是4个字符,100kg是5个字符),导致第三行的类别A被错误合并到pack列。以下是两种可靠的解决方法:
方法一:两次拆分(基于最后一个空格)
利用正则匹配最后一个空格,先拆分出pack,再拆分剩下的内容得到name和class:
library(tidyr) library(dplyr) dt <- dat %>% # 拆分最后一个空格后的内容作为pack separate(name, into = c('temp', 'pack'), sep = ' (?=[^ ]+$)', perl = TRUE) %>% # 拆分剩余内容的最后一个空格,得到name和class separate(temp, into = c('name', 'class'), sep = ' (?=[^ ]+$)', perl = TRUE)
运行结果:
name class pack 1 Jhon Austin B 100kg 2 Mick Gray C 110kg 3 Tom Jef A 30kg
方法二:一次性正则提取
如果你的数据格式固定(class是单个大写字母,pack是数字+kg),可以用extract函数一次性捕获三个分组:
dt <- dat %>% extract(name, into = c('name', 'class', 'pack'), regex = '(.+) ([A-Z]) ([0-9]+kg)')
这个正则表达式的逻辑:
(.+):捕获前面的姓名部分(直到最后一个大写字母前的空格)([A-Z]):捕获单个大写字母作为类别([0-9]+kg):捕获数字加kg的重量部分
运行后同样能得到你期望的结果。
内容的提问来源于stack exchange,提问作者Rokib
相关产品推荐
相关产品推荐

