2 votes

Compter le nombre d'occurrences de lettres multiples dans une variable au sein d'un dataframe?

Il suffit de dire que je veux compter le nombre de "a" et de "p" dans le mot "apple", je peux faire :

library(stringr)
sum(str_count("apple", c("a", "p")))

mais lorsque j'essaie d'appliquer cette logique pour compter le nombre de "a" et de "p" à travers plusieurs mots différents dans une variable dans un dataframe, cela ne fonctionne pas, par exemple :

dat <- tibble(id = 1:4, word = c("apple", "banana", "pear", "pineapple"))
dat <- dat %>% mutate(num_ap = sum(str_count(word, c("a", "p"))))

ça ne marche pas. La variable "num_ap" devrait afficher c(3, 3, 2, 4) mais au lieu de cela elle affiche c(5, 5, 5, 5)

Est-ce que quelqu'un sait pourquoi cela ne fonctionne pas pour moi ?

Merci !

3voto

Fabian B Points 181

Dans des cas comme celui-ci, il est utile de revenir en arrière pour comprendre le problème.

str_count(dat$word, c("a", "p")) en soi renverra [1] 1 0 1 3. Chaque chiffre représente le nombre de fois que la lettre 'p' apparaît dans chaque mot de votre dataframe. Si vous prenez la somme de ce vecteur avec sum(str_count(dat$word, c("a", "p"))), vous obtenez [1] 5. Étant donné que vous ne parcourez pas ligne par ligne, chaque ligne se verra attribuer une valeur de 5, ce qui est cohérent avec vos résultats.

Pour corriger cela, notez que la fonction rowwise() (partie de la bibliothèque dplyr) vous permet de travailler avec chaque ligne individuellement. Ainsi, en modifiant votre code pour incorporer la fonction rowwise(), vous résoudrez votre problème :

dat <- dat %>% rowwise() %>% mutate(num_ap = sum(str_count(word, c("a", "p"))))

2voto

Jan Points 2954

sapply la transformation à chaque élément de dat$word

library(stringr)
dat <- data.frame(id = 1:4, word = c(c("apple", "banana", "pear", "pineapple")))
dat$num_ap <- sapply(dat$word, function(x) sum(str_count(x, c("a", "p"))))

dat
#>   id      word num_ap
#> 1  1     apple      3
#> 2  2    banana      3
#> 3  3      pear      2
#> 4  4 pineapple      4

Créé le 2021-10-14 par le paquet reprex (v2.0.1)

2voto

Chris Ruehlemann Points 915

Deux solutions (les deux sans sum):

avec rowwise():

library(dplyr)
library(stringr)
dat %>%
  rowwise() %>%
  mutate(num_ap = str_count(word, "a|p"))
  id      word num_ap
1  1     apple      3
2  2    banana      3
3  3      pear      2
4  4 pineapple      4

avec lengths et str_extract_all:

library(dplyr)
library(stringr)
dat %>%
  mutate(num_ap = lengths(str_extract_all(word, "a|p")))
  id      word num_ap
1  1     apple      3
2  2    banana      3
3  3      pear      2
4  4 pineapple      4

0voto

akrun Points 148302

Utilisation de base R

dat$num_ap <-  nchar(gsub("[^ap]", "", dat$word))

-sortie

> dat
  id      word num_ap
1  1     apple      3
2  2    banana      3
3  3      pear      2
4  4 pineapple      4

data

dat <- structure(list(id = 1:4, word = c("apple", "banana", "pear", 
"pineapple")), class = "data.frame", row.names = c(NA, -4L))

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