r - 当字符串属于不同的类时,如何将 tibble 中的字符串分成新列?
问题描述
我在 tibble 中有一个列,条目形式为 2XYZ005GHT108,我想将它们分成 4 个新列:“2XYZ”、“005”、“GHT”和“108”。我的条目不包含分隔符。我不知道在tidyr 的separate() 函数中输入什么作为sep = 参数。
library(tidyverse)
library(dplyr)
df <- tibble(x = c("2XYZ005GHT108", "4T005N108"))
df %>%
separate(x, C("Product", "Size", "Country", "Pall"), sep = "[^[:alnum:]]+", remove = FALSE)
解决方案
1)如果字段可以是可变长度的,但我们知道第二个和第四个都是数字,并且至少包含 2 个字符,并且其他字段连续不超过一个数字,并且不会有相邻的数字一个全数字字段,那么我们可以用一个空格、相同的字符串和另一个空格替换任何 2 个或多个数字的字符串。然后我们可以使用separate
. 将gsub
在末尾放置一个空格,表示预期的第 5 个字段,尽管不存在,因此请在separate
语句中使用 NA 字段来吸收这一点。(Alternately use the extra = "drop"
论据separate
。)
library(dplyr)
library(tibble)
library(tidyr)
df %>%
mutate(x = gsub("(\\d\\d+)", " \\1 ", x)) %>%
separate(x, c("Product", "Size", "Country", "Pall", NA))
## # A tibble: 2 x 4
## Product Size Country Pall
## <chr> <chr> <chr> <chr>
## 1 2XYZ 005 GHT 108
## 2 4T 005 N 108
2) read.pattern我们可以交替使用read.pattern
假设第一个字段是数字后跟非数字,第二个字段是数字,第三个字段以非数字结尾,第四个是数字。
library(gsubfn)
pat <- "^(\\d\\D+)(\\d+)(.*\\D)(\\d+)"
read.pattern(text = df$x, pattern = pat, colClasses = "character",
col.names = c("Product", "Size", "Country", "Pall"))
## Product Size Country Pall
## 1 2XYZ 005 GHT 108
## 2 4T 005 N 108
2a) strcapture这也可以通过使用pat
上面定义的仅使用基础 R 来完成,strcapture
如下所示:
strcapture(pat, df$x, list(Product = character(0), Size = character(0),
Country = character(0), Pall = character(0)))
## Product Size Country Pall
## 1 2XYZ 005 GHT 108
## 2 4T 005 N 108