我有一个字符数据向量.矢量中的大多数元素由一个或多个字母后跟一个或多个数字组成.我希望将向量中的每个元素分成字符部分和数字部分.我在Stackoverflow.com上发现了类似的问题:
但是,上面给出的答案似乎并不完全适用于我的情况或我做错了什么.示例向量如下:
my.data <- c("aaa", "b11", "b21", "b101", "b111", "ccc1", "ddd1", "ccc20", "ddd13")
# I can obtain the number portion using:
gsub("[^[:digit:]]", "", my.data)
# However, I cannot obtaining the character portion using:
gsub("[:digit:]", "", my.data)
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得角色部分?我在Windows 7 64位计算机上使用R版本2.14.1.
mat*_*fee 20
对于你的正则表达式,你必须使用:
gsub("[[:digit:]]","",my.data)
Run Code Online (Sandbox Code Playgroud)
该[:digit:]字符类只让一组内部感[].
Ben*_*Ben 17
有了stringr,如果你喜欢(从稍微不同的答案,其他问题):
# load library
library(stringr)
#
# load data
my.data <- c("aaa", "b11", "b21", "b101", "b111", "ccc1", "ddd1", "ccc20", "ddd13")
#
# extract numbers only
my.data.num <- as.numeric(str_extract(my.data, "[0-9]+"))
#
# check output
my.data.num
[1] NA 11 21 101 111 1 1 20 13
#
# extract characters only
my.data.cha <- (str_extract(my.data, "[aA-zZ]+"))
#
# check output
my.data.cha
[1] "aaa" "b" "b" "b" "b" "ccc" "ddd" "ccc" "ddd"
Run Code Online (Sandbox Code Playgroud)
mer*_*ops 17
由于以前的答案都没有在tidyr::separate这里使用它:
library(tidyr)
df <- data.frame(mycol = c("APPLE348744", "BANANA77845", "OATS2647892", "EGG98586456"))
df %>%
separate(mycol,
into = c("text", "num"),
sep = "(?<=[A-Za-z])(?=[0-9])"
)
Run Code Online (Sandbox Code Playgroud)
较晚的答案,但另一个选择是strsplit与正则表达式模式一起使用,该模式使用环视查找数字和字母之间的边界:
var <- "ABC123"
strsplit(var, "(?=[A-Za-z])(?<=[0-9])|(?=[0-9])(?<=[A-Za-z])", perl=TRUE)
[[1]]
[1] "ABC" "123"
Run Code Online (Sandbox Code Playgroud)
当前一个字符是字母而后一个字符是数字时,上述模式将匹配(但不会使用),反之亦然。请注意,我们strsplit在Perl模式下使用来访问环顾四周。
稍微更优雅的方式(没有任何外部包):
> x = c("aaa", "b11", "b21", "b101", "b111", "ccc1", "ddd1", "ccc20", "ddd13")
> gsub('\\D','', x) # replaces non-digits with blancs
[1] "" "11" "21" "101" "111" "1" "1" "20" "13"
> gsub('\\d','', x) # replaces digits with blanks
[1] "aaa" "b" "b" "b" "b" "ccc" "ddd" "ccc" "ddd"
Run Code Online (Sandbox Code Playgroud)