首页 > 解决方案 > 当字符串属于不同的类时,如何将 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)

标签: rdplyrtidyr

解决方案


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

推荐阅读