2011-12-30 1 views
4

I ont une colonne de noms fermes dans un R dataframe qui va quelque chose comme ceci:découpage de chaînes et la génération de tableaux de fréquence R

"ABC Industries" 
"ABC Enterprises" 
"123 and 456 Corporation" 
"XYZ Company" 

Et ainsi de suite. Je suis en train de générer des tableaux de fréquence de chaque mot qui apparaît dans cette colonne, donc par exemple, quelque chose comme ceci:

Industries 10 
Corporation 31 
Enterprise 40 
ABC   30 
XYZ   40 

Je suis relativement nouveau pour R, donc je me demandais d'une bonne façon pour aborder cela. Dois-je séparer les chaînes et placer chaque mot distinct dans une nouvelle colonne? Existe-t-il un moyen de diviser une ligne de plusieurs mots en plusieurs lignes avec un seul mot?

Répondre

9

Si vous voulez, vous pouvez le faire dans une seule ligne:

R> text <- c("ABC Industries", "ABC Enterprises", 
+   "123 and 456 Corporation", "XYZ Company") 
R> table(do.call(c, lapply(text, function(x) unlist(strsplit(x, " "))))) 

     123   456   ABC   and  Company 
      1   1   2   1   1 
Corporation Enterprises Industries   XYZ 
      1   1   1   1 
R> 

Ici, j'utiliser strsplit() pour briser chaque composant d'introduction d'entrée; cela renvoie une liste (dans une liste). J'utilise do.call() donc concaténer simplement toutes les listes de résultats en un seul vecteur, qui résume table().

+0

Merci beaucoup. J'ai joué avec le code original et je trouve que j'obtiens le même résultat avec: table (unlist (strsplit (text, ""))) À quoi servent lapply() et do.call() ? – aesir

6

Voici une autre doublure. Il utilise paste() de combiner toutes les entrées de la colonne en une seule chaîne de texte long, dont il se divise alors en dehors et classifie:

text <- c("ABC Industries", "ABC Enterprises", 
     "123 and 456 Corporation", "XYZ Company") 

table(strsplit(paste(text, collapse=" "), " ")) 
+1

+1 Super, je voudrais seulement ajouter split = "\\ s {1,}" pour le rendre plus robuste –

+0

@WojciechSobala Yep - J'ai eu la même pensée, et c'est probablement mieux/plus proche de ce que l'OP veut. 'split =" \\ s + "' ou 'split =" [[: space:]] + "' sont deux autres options exactement équivalentes. –

0

Vous pouvez utiliser le package tidytext et dplyr:

set.seed(42) 

text <- c("ABC Industries", "ABC Enterprises", 
     "123 and 456 Corporation", "XYZ Company") 

data <- data.frame(category = sample(text, 100, replace = TRUE), 
        stringsAsFactors = FALSE) 

library(tidytext) 
library(dplyr) 

data %>% 
    unnest_tokens(word, category) %>% 
    group_by(word) %>% 
    count() 

#> # A tibble: 9 x 2 
#> # Groups: word [9] 
#>   word  n 
#>   <chr> <int> 
#> 1   123 29 
#> 2   456 29 
#> 3   abc 45 
#> 4   and 29 
#> 5  company 26 
#> 6 corporation 29 
#> 7 enterprises 21 
#> 8 industries 24 
#> 9   xyz 26