Dividir la columna de cadena del marco de datos en varias columnas

Resuelto jkebinger asked hace 55 años • 18 respuestas

Me gustaría tomar datos del formulario.

before = data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar_2'))
  attr          type
1    1   foo_and_bar
2   30 foo_and_bar_2
3    4   foo_and_bar
4    6 foo_and_bar_2

y utilícelo split()en la columna " type" de arriba para obtener algo como esto:

  attr type_1 type_2
1    1    foo    bar
2   30    foo  bar_2
3    4    foo    bar
4    6    foo  bar_2

Se me ocurrió algo increíblemente complejo que involucraba alguna forma de applyeso que funcionó, pero desde entonces lo perdí. Parecía demasiado complicado para ser la mejor manera. Puedo usar strsplitlo siguiente, pero no tengo claro cómo volver a colocarlo en 2 columnas en el marco de datos.

> strsplit(as.character(before$type),'_and_')
[[1]]
[1] "foo" "bar"

[[2]]
[1] "foo"   "bar_2"

[[3]]
[1] "foo" "bar"

[[4]]
[1] "foo"   "bar_2"

Gracias por cualquier consejo. Todavía no he asimilado las listas R.

jkebinger avatar Jan 01 '70 08:01 jkebinger
Aceptado

Usarstringr::str_split_fixed

library(stringr)
str_split_fixed(before$type, "_and_", 2)
hadley avatar Dec 04 '2010 04:12 hadley

Puedes usar el tidyrpaquete.

before <- data.frame(
  attr = c(1, 30 ,4 ,6 ), 
  type = c('foo_and_bar', 'foo_and_bar_2')
)

library(tidyr)
before |>
  separate_wider_delim(type, delim = "_and_", names = c("foo", "bar"))
# # A tibble: 4 × 3
#    attr foo   bar  
#   <dbl> <chr> <chr>
# 1     1 foo   bar  
# 2    30 foo   bar_2
# 3     4 foo   bar  
# 4     6 foo   bar_2

(O usar versiones anteriores de tidyr)

before %>%
  separate(type, c("foo", "bar"), "_and_")

##   attr foo   bar
## 1    1 foo   bar
## 2   30 foo bar_2
## 3    4 foo   bar
## 4    6 foo bar_2
hadley avatar Jun 11 '2014 16:06 hadley