2017-10-06 5 views
1

J'ai un dataframe avec quelques colonnes comme ceci:Compter toutes les lettres (26) de l'une des variables de caractère dans une trame de données

Attr Description 
60  asdfg asdg dfs 
50  smlefekl dewld ewf 
35  kojewdfhef e 

Tout ce que je besoin est de créer 26 supplémentaires colonnes avec des comptes de chaque lettre d'affilée. Je sais que je peux utiliser:

table(unlist(strsplit(mydata, ""), use.names=FALSE)) 

pour un vecteur, mais comment puis-je le mettre à jour pour une trame de données?

+1

Essayez 'lapply (lettres, fonct ion (x) str_count (dat $ col, x)) ' – akrun

+0

Merci, akrun, mais il me donne juste une liste de vecteurs avec des zéros – VR6

+0

Si vous vérifiez la solution ci-dessous, il est changé – akrun

Répondre

0

Si nous utilisons le strsplit, nous devrons peut-être créer un factor avec levels spécifié comme « lettres »

d1 <- stack(setNames(strsplit(df1$Description, ""), seq_len(nrow(df1)))) 
d2 <- subset(d1, values != " ") 
d2$values <- factor(d2$values, levels = letters) 
t(table(d2)) 
# values 
# ind a b c d e f g h i j k l m n o p q r s t u v w x y z  
# 1 2 0 0 3 0 2 2 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 
# 2 0 0 0 2 4 2 0 0 0 0 1 3 1 0 0 0 0 0 1 0 0 0 2 0 0 0 
# 3 0 0 0 1 3 2 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 

Ou comme indiqué dans les commentaires, utilisez le str_count de stringr en boucle à travers les 'lettres' obtenir le compte de cette lettre pour chaque ligne de 'Description'

library(stringr) 
t(sapply(letters, function(x) str_count(df1$Description, x))) 
+0

Merci encore, mais maintenant je reçois un matrice de 26 xrows avec tous les zéros ..? – VR6

+0

@ VR6 Basé sur les données que vous avez montrées, je ne reçois pas tous les – akrun

+0

J'ai composé la colonne Description pour des raisons de sécurité. Tous les caractères étaient en majuscules, donc j'ai utilisé la fonction tolower et je reçois quelque chose :) – VR6