我想知道如何将包含字符和数字的列拆分为两列:字符和数字。问题是我之间没有任何特殊字符,我可以简单地使用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
列分为chars
和nums
:
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]