6
votes

Réduire un groupe de chaînes en une seule chaîne à l'aide d'une instruction if dans une boucle for dans R

J'ai un dataframe avec une colonne "Food".

fruit_list <- c("banana","apple","orange","strawberry","kiwi","blueberry","lemon")

for (r in 1:nrow(dataframe)) {
  for (i in 1:length(fruit_list)){
    if (length(grep(fruit_list[i], dataframe$Food[r])) != 0) { 
      dataframe$Food[r] <- paste("fruit") 
    }
  }
}

Chaque fois qu'un fruit apparaît, je veux remplacer le nom du fruit par "fruit".

J'ai essayé de créer un vecteur des noms des fruits. Ensuite, je parcours chaque ligne du dataframe et là où la chaîne correspond au fruit, je veux remplacer le nom du fruit par "fruit".

dataframe <- data.frame(Color = c("red","red","red","red","red","blue","blue","blue","blue","blue","green","green","green","green","green","orange","orange","orange","orange","orange"), 
Food = c("banana","apple","potato","orange","egg","strawberry","cheese","yogurt","kiwi","butter","kale","sugar","carrot","celery","radish","cereal","milk","blueberry","squash","lemon"), Count = c(2,5,4,8,10,7,5,6,9,11,1,8,5,3,7,9,2,3,6,4))

Comment utiliser ce général format de sorte que dataframe $ Food ne finisse pas simplement par être rempli de NA?


4 commentaires

Avez-vous seulement besoin d'une boucle for?


dataframe $ Food [which (dataframe $ Food% in% fruit_list)] <- "fruit" fournit ce remplacement?


Vous pouvez essayer dataframe%>% mutate (Food = case_when (Food% in% fruit_list ~ str_c (Food, "."), TRUE ~ as.character (Food)))


Je ne suis pas totalement marié à ce format mais il s'agit d'un exemple de dataframe et celui sur lequel je travaille est assez long, alors j'ai pensé que ce serait le meilleur format?


4 Réponses :


2
votes

Avec dplyr :

 Color   Food Count
1     red  Fruit     2
2     red  Fruit     5
3     red potato     4
4     red  Fruit     8
5     red    egg    10
6    blue  Fruit     7
7    blue cheese     5
8    blue yogurt     6
9    blue  Fruit     9
10   blue butter    11
11  green   kale     1
12  green  sugar     8
13  green carrot     5
14  green celery     3
15  green radish     7
16 orange cereal     9
17 orange   milk     2
18 orange  Fruit     3
19 orange squash     6
20 orange  Fruit     4

Résultat:

  library(dplyr)
    ataframe %>% 
      mutate(Food=as.character(Food),
             Food=ifelse(Food%in%fruit_list,"Fruit",Food))#can change to fruit


0 commentaires

2
votes

Uniquement base R:

dataframe$Food <- 
sapply(dataframe$Food,
        function(x,fruit_list) ifelse(x %in% fruit_list, "fruit", as.character(x) ),
        fruit_list = fruit_list ) 


0 commentaires

0
votes

Vous n'avez pas nécessairement besoin de dplyr pour cela. Utilisez simplement:

dataframe$Food <- ifelse(dataframe$Food %in% fruit_list, "Fruit", as.character(dataframe$Food))


0 commentaires

0
votes

Vous pouvez le faire en une seule ligne en utilisant data.table package-

> setDT(dataframe)[,Food:=ifelse(Food %in% fruit_list,"fruit",as.character(Food))]

Color   Food Count
 1:    red  fruit     2
 2:    red  fruit     5
 3:    red potato     4
 4:    red  fruit     8
 5:    red    egg    10
 6:   blue  fruit     7
 7:   blue cheese     5
 8:   blue yogurt     6
 9:   blue  fruit     9
10:   blue butter    11
11:  green   kale     1
12:  green  sugar     8
13:  green carrot     5
14:  green celery     3
15:  green radish     7
16: orange cereal     9
17: orange   milk     2
18: orange  fruit     3
19: orange squash     6
20: orange  fruit     4


0 commentaires