我在 tibble 中有一列,其中包含 2XYZ005GHT108 形式的条目,我想将它们分成 4 个新列:"2XYZ"、"005"、"GHT"和"108"。我的条目不包含分隔符。我不知道在 tidyr 的 separ(( 函数中输入什么作为 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
来完成,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
您可以使用substr
来实现此目的。有关详细信息,请参阅?substr
df %>% mutate(Product = substr(x, 1,4), Size = substr(x, 5,7))
如果字符串的长度不固定,请检查 @g-Grothendieck 的答案