将字符数据拆分为数字和字母

Mar*_*ler 22 r

我有一个字符数据向量.矢量中的大多数元素由一个或多个字母后跟一个或多个数字组成.我希望将向量中的每个元素分成字符部分和数字部分.我在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)

  • “?&lt;=”是“向后看”:在这里,它基本上匹配“在光标之前”的任何大写或小写字母([[A-Za-z]`)。“?=”是“向前看”:它与“游标之后”的任何数字([`0-9`])相匹配。这两个“移动光标”都没有,因此它们放在一起就匹配字母和数字的“中间”,即我们要分割的位置。有关ICU正则表达式的更多信息,请参见[here](http://userguide.icu-project.org/strings/regexp)。 (6认同)

Tim*_*sen 7

较晚的答案,但另一个选择是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模式下使用来访问环顾四周。

演示版


Ole*_*kov 5

稍微更优雅的方式(没有任何外部包):

> 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)