当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R tidyr separate 使用正则表达式或数字位置将字符列分成多列


[Superseded]

separate() 已被 separate_wider_position()separate_wider_delim() 取代,因为这两个函数使两者的用途更加明显,API 更加完善,问题处理也更好。被取代的函数不会消失,但只会收到关键的错误修复。

给定正则表达式或字符位置向量,separate() 将单个字符列转换为多个列。

用法

separate(
  data,
  col,
  into,
  sep = "[^[:alnum:]]+",
  remove = TRUE,
  convert = FALSE,
  extra = "warn",
  fill = "warn",
  ...
)

参数

data

一个 DataFrame 。

col

< tidy-select > 要展开的列。

into

要创建为字符向量的新变量的名称。使用 NA 省略输出中的变量。

sep

列之间的分隔符。

如果是字符,sep 被解释为正则表达式。默认值是匹配任何非字母数字值序列的正则表达式。

如果是数字,sep 被解释为要分割的字符位置。正值从字符串最左边的 1 开始;负值从字符串最右侧的 -1 开始。 sep 的长度应比 into 少 1。

remove

如果 TRUE ,从输出数据帧中删除输入列。

convert

如果 TRUE ,将在新列上运行 type.convert()as.is = TRUE。如果组件列是整数、数字或逻辑,这非常有用。

注意:这将导致字符串 "NA" 转换为 NA

extra

如果 sep 是一个字符向量,则它控制当片段太多时会发生什么。共有三个有效选项:

  • "warn"(默认值):发出警告并删除额外的值。

  • "drop" :删除任何额外的值而不发出警告。

  • "merge" :最多仅分裂length(into)

fill

如果 sep 是字符向量,则它控制当没有足够的块时会发生什么。共有三个有效选项:

  • "warn"(默认):发出警告并从右侧填充

  • "right" :在右侧填充缺失值

  • "left" :填充左侧缺失值

...

传递给方法的附加参数。

也可以看看

unite() ,补码,extract() 使用正则表达式捕获组。

例子

# If you want to split by any non-alphanumeric value (the default):
df <- tibble(x = c(NA, "x.y", "x.z", "y.z"))
df %>% separate(x, c("A", "B"))
#> # A tibble: 4 × 2
#>   A     B    
#>   <chr> <chr>
#> 1 NA    NA   
#> 2 x     y    
#> 3 x     z    
#> 4 y     z    

# If you just want the second variable:
df %>% separate(x, c(NA, "B"))
#> # A tibble: 4 × 1
#>   B    
#>   <chr>
#> 1 NA   
#> 2 y    
#> 3 z    
#> 4 z    

# We now recommend separate_wider_delim() instead:
df %>% separate_wider_delim(x, ".", names = c("A", "B"))
#> # A tibble: 4 × 2
#>   A     B    
#>   <chr> <chr>
#> 1 NA    NA   
#> 2 x     y    
#> 3 x     z    
#> 4 y     z    
df %>% separate_wider_delim(x, ".", names = c(NA, "B"))
#> # A tibble: 4 × 1
#>   B    
#>   <chr>
#> 1 NA   
#> 2 y    
#> 3 z    
#> 4 z    

# Controlling uneven splits -------------------------------------------------
# If every row doesn't split into the same number of pieces, use
# the extra and fill arguments to control what happens:
df <- tibble(x = c("x", "x y", "x y z", NA))
df %>% separate(x, c("a", "b"))
#> Warning: Expected 2 pieces. Additional pieces discarded in 1 rows [3].
#> Warning: Expected 2 pieces. Missing pieces filled with `NA` in 1 rows [1].
#> # A tibble: 4 × 2
#>   a     b    
#>   <chr> <chr>
#> 1 x     NA   
#> 2 x     y    
#> 3 x     y    
#> 4 NA    NA   
# The same behaviour as previous, but drops the c without warnings:
df %>% separate(x, c("a", "b"), extra = "drop", fill = "right")
#> # A tibble: 4 × 2
#>   a     b    
#>   <chr> <chr>
#> 1 x     NA   
#> 2 x     y    
#> 3 x     y    
#> 4 NA    NA   
# Opposite of previous, keeping the c and filling left:
df %>% separate(x, c("a", "b"), extra = "merge", fill = "left")
#> # A tibble: 4 × 2
#>   a     b    
#>   <chr> <chr>
#> 1 NA    x    
#> 2 x     y    
#> 3 x     y z  
#> 4 NA    NA   
# Or you can keep all three:
df %>% separate(x, c("a", "b", "c"))
#> Warning: Expected 3 pieces. Missing pieces filled with `NA` in 2 rows [1, 2].
#> # A tibble: 4 × 3
#>   a     b     c    
#>   <chr> <chr> <chr>
#> 1 x     NA    NA   
#> 2 x     y     NA   
#> 3 x     y     z    
#> 4 NA    NA    NA   

# To only split a specified number of times use extra = "merge":
df <- tibble(x = c("x: 123", "y: error: 7"))
df %>% separate(x, c("key", "value"), ": ", extra = "merge")
#> # A tibble: 2 × 2
#>   key   value   
#>   <chr> <chr>   
#> 1 x     123     
#> 2 y     error: 7

# Controlling column types --------------------------------------------------
# convert = TRUE detects column classes:
df <- tibble(x = c("x:1", "x:2", "y:4", "z", NA))
df %>% separate(x, c("key", "value"), ":") %>% str()
#> Warning: Expected 2 pieces. Missing pieces filled with `NA` in 1 rows [4].
#> tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>  $ key  : chr [1:5] "x" "x" "y" "z" ...
#>  $ value: chr [1:5] "1" "2" "4" NA ...
df %>% separate(x, c("key", "value"), ":", convert = TRUE) %>% str()
#> Warning: Expected 2 pieces. Missing pieces filled with `NA` in 1 rows [4].
#> tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>  $ key  : chr [1:5] "x" "x" "y" "z" ...
#>  $ value: int [1:5] 1 2 4 NA NA
源代码:R/separate.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Separate a character column into multiple columns with a regular expression or numeric locations。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。