separate {tidyr} | R Documentation |
Given either regular expression or a vector of character positions,
separate()
turns a single character column into multiple columns.
separate(data, col, into, sep = "[^[:alnum:]]+", remove = TRUE, convert = FALSE, extra = "warn", fill = "warn", ...)
data |
A data frame. |
col |
Column name or position. This is passed to
This argument is passed by expression and supports quasiquotation (you can unquote column names or column positions). |
into |
Names of new variables to create as character vector.
Use |
sep |
Separator between columns. If character, is interpreted as a regular expression. The default value is a regular expression that matches any sequence of non-alphanumeric values. If numeric, interpreted as positions to split at. Positive values start
at 1 at the far-left of the string; negative value start at -1 at the
far-right of the string. The length of |
remove |
If |
convert |
If |
extra |
If
|
fill |
If
|
... |
Additional arguments passed on to methods. |
unite()
, the complement, extract()
which uses regular
expression capturing groups.
library(dplyr) df <- data.frame(x = c(NA, "a.b", "a.d", "b.c")) df %>% separate(x, c("A", "B")) # If you just want the second variable: df %>% separate(x, c(NA, "B")) # If every row doesn't split into the same number of pieces, use # the extra and fill arguments to control what happens df <- data.frame(x = c("a", "a b", "a b c", NA)) df %>% separate(x, c("a", "b")) # The same behaviour drops the c but no warnings df %>% separate(x, c("a", "b"), extra = "drop", fill = "right") # Another option: df %>% separate(x, c("a", "b"), extra = "merge", fill = "left") # Or you can keep all three df %>% separate(x, c("a", "b", "c")) # If only want to split specified number of times use extra = "merge" df <- data.frame(x = c("x: 123", "y: error: 7")) df %>% separate(x, c("key", "value"), ": ", extra = "merge") # Use regular expressions to separate on multiple characters: df <- data.frame(x = c(NA, "a?b", "a.d", "b:c")) df %>% separate(x, c("A","B"), sep = "([\\.\\?\\:])") # convert = TRUE detects column classes df <- data.frame(x = c("a:1", "a:2", "c:4", "d", NA)) df %>% separate(x, c("key","value"), ":") %>% str df %>% separate(x, c("key","value"), ":", convert = TRUE) %>% str # Argument col can take quasiquotation to work with strings var <- "x" df %>% separate(!!var, c("key","value"), ":")