302 votes

À l'aide de strsplit avec des trames de données à split étiquette de colonnes en plusieurs

J'aimerais prendre les données du formulaire

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

et l'utilisation de split le type de colonne pour obtenir quelque chose comme ceci:

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

Je suis venu avec quelque chose d'incroyablement complexes, impliquant une certaine forme d'appliquer cela a fonctionné, mais depuis, j'ai égaré que. Il semble beaucoup trop compliqué pour être le meilleur moyen. Je peux utiliser strsplit comme ci-dessous, mais alors mal comment le récupérer en 2 colonnes dans le bloc de données.

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

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

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

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

Merci pour tous les pointeurs. Je n'ai pas assez groked R des listes pour l'instant.

328voto

hadley Points 33766

Utiliser stringr::str_split_fixed

library(stringr)
str_split_fixed(before$type, "_and_", 2)

231voto

hadley Points 33766

Une autre option est d'utiliser le nouveau tidyr paquet.

library(dplyr)
library(tidyr)

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

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

65voto

Aniko Points 7555

Pourtant, une autre approche: utiliser rbind sur out:

before <- data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar_2'))  
out <- strsplit(as.character(before$type),'_and_') 
do.call(rbind, out)

     [,1]  [,2]   
[1,] "foo" "bar"  
[2,] "foo" "bar_2"
[3,] "foo" "bar"  
[4,] "foo" "bar_2"

Et à combiner:

data.frame(before$attr, do.call(rbind, out))

43voto

BondedDust Points 105234

Notez que sapply avec "[" peut être utilisé pour extraire le premier ou le deuxième éléments de ces listes:

before$type_1 < sapply(strsplit(as.character(before$type),'_and_'), "[", 1)
before$type_2 < sapply(strsplit(as.character(before$type),'_and_'), "[", 2)
before$type <- NULL

Et voici un gsub méthode:

before$type_1 <- gsub("_and_.+$", "", before$type)
before$type_2 <- gsub("^.+_and_", "", before$type)
before$type <- NULL

32voto

Ramnath Points 24798

voici un liner le long des mêmes lignes que aniko de la solution, mais à l'aide de hadley est stringr paquet:

do.call(rbind, str_split(before$type, '_and_'))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X