如何用tidyr将字符串每个字符拆分为列?R语言技术求助
解决R中拆分字符串为单个字符列的问题
嘿,刚学R遇到这种小问题很正常,我来帮你搞定!你现在的需求是把每个3字符的字符串拆成单独的三列,之前用separate时sep=1只能拆成两列,是因为这个参数的作用是指定拆分的位置或分隔符,sep=1是在第1个字符后面拆一刀,自然只能分成两部分。
给你两种简单有效的方法:
方法一:用separate配合环视正则
我们可以用正则表达式的正向肯定环视来匹配每个字符后面的位置,这样就能在每两个字符之间拆分,刚好得到三列:
library(tidyr) library(dplyr) df <- data.frame(x = c("abe", "bas", "dds", "eer")) df %>% separate(x, into = c("A", "B", "C"), sep = "(?<=.)")
这里的(?<=.)意思是“匹配任意单个字符后面的位置”,相当于在每个字符后都拆一下,3个字符就会被拆成3列,完美符合你的预期输出。
方法二:用stringr包直接提取字符
如果你觉得正则有点绕,也可以用stringr的str_sub直接按位置提取每个字符,更直观:
library(stringr) library(dplyr) df <- data.frame(x = c("abe", "bas", "dds", "eer")) df %>% mutate( A = str_sub(x, 1, 1), # 提取第1个字符 B = str_sub(x, 2, 2), # 提取第2个字符 C = str_sub(x, 3, 3) # 提取第3个字符 )
为什么你之前的正则没生效?
你试的sep="."或sep="[a-z]"是把这些字符当作分隔符来匹配,但你的字符串里没有点号,而[a-z]会把每个字母当成分隔符,拆分后就只剩空值了,这显然不是你要的效果~
如果你的字符串长度不全是3,还可以给separate加个fill = "right"或者fill = "left"参数来处理长度不一致的情况哦。
内容的提问来源于stack exchange,提问作者user3093582
相关产品推荐
相关产品推荐

