r语言 - 当字符串属于不同类时,如何将 tibble 中的字符串分隔成新列?



我在 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 的答案

最新更新