use*_*932 6 regex string r tidyverse
我正在尝试在字符串列中分隔数字和字符。到目前为止,我一直tidyr::separate在这样做,但是在“异常”情况下遇到错误。
假设我有以下数据
df <- data.frame(c1 = c("5.5K", "2M", "3.1", "M"))
Run Code Online (Sandbox Code Playgroud)
我想获得带有列的数据框
data.frame(c2 = c("5.5", "2", "3.1", NA),
c3 = c("K", "M", NA, "M))
Run Code Online (Sandbox Code Playgroud)
到目前为止,我一直在使用 tidyr::separate
df %>%
separate(c1, into =c("c2", "c3"), sep = "(?<=[0-9])(?=[A-Za-z])")
Run Code Online (Sandbox Code Playgroud)
但这仅适用于前三种情况。我意识到这是因为?<=...并?=...需要使用正则表达式。如何修改此代码以捕获字母前缺少数字的情况?extract也在尝试使用该功能,但没有成功。
编辑:我想一种解决方案是将其分解为
df$col2 <- as.numeric(str_extract(df$col1, "[0-9]+"))
df$col3 <- (str_extract(df$col1, "[aA-zZ]+"))
Run Code Online (Sandbox Code Playgroud)
但是我很好奇是否还有其他处理方式。
extract(df, c1, into =c("c2", "c3"), "([\\.\\d]*)([a-zA-Z]*)")
# c2 c3
# 1 5.5 K
# 2 2 M
# 3 3.1
# 4 M
Run Code Online (Sandbox Code Playgroud)
你可以seperate简单地用这种方式,但应该有一个更优雅的方法..
df %>% separate(c1, into =c("c2", "c3"), sep = "(?=[A-Za-z])")
# c2 c3
# 1 5.5 K
# 2 2 M
# 3 3.1 <NA>
# 4 M
Run Code Online (Sandbox Code Playgroud)