R:将缺少分隔符的不均匀长度字符串拆分为两个列:单独的字符和数字



我想知道如何将包含字符和数字的列拆分为两列:字符和数字。问题是我之间没有任何特殊字符,我可以简单地使用gsub(old, new, names),而且我的字符数在"数字"之前也不同:

例:

# Create data frame with values containing characters and strings: both of uneven sizes:
df<- data.frame(names = c("ALL10", 
"ALL3", 
"CCF8", 
"not_CCF19"),
stringsAsFactors = F)

我想得到的:names列分为charsnums

names  chars   nums
1     ALL10     ALL    10
2      ALL3     ALL     3
3      CCF8     CCF     8
4 not_CCF19 not_CCF    19

我在想我可以尝试:

  • not_CCF替换为正好 3 个字符的内容,
  • 然后将前 3 个字符拆分为一列,剩余的拆分为第二列,依此类推。

但我真的想不通,也许还有更简单的东西?

base中,您可以使用regexpr查找第一个数字的位置,并使用substr获取该位置之前或之后的字符串。

i <- regexpr("\d", df$names)
df$chars <- substr(df$names, 1, i-1)
df$nums <- substring(df$names, i)
df
#      names   chars nums
#1     ALL10     ALL   10
#2      ALL3     ALL    3
#3      CCF8     CCF    8
#4 not_CCF19 not_CCF   19

您可以使用tidyr中的extract来获取两列中的数据,其中第一列将包含所有内容,直到遇到数字,第二列将包含数字部分。

tidyr::extract(df, names, c('chars', 'nums'), '(.*?)(\d+)', remove = FALSE)
#      names   chars nums
#1     ALL10     ALL   10
#2      ALL3     ALL    3
#3      CCF8     CCF    8
#4 not_CCF19 not_CCF   19

您可以在str_match中使用相同的正则表达式:

stringr::str_match(df$names, '(.*?)(\d+)')[, -1]

最新更新