Сворачивание группы строк в одну строку с помощью оператора if в цикле for в R

#r #for-loop #if-statement

#r #for-цикл #if-оператор

Вопрос:

У меня есть фрейм данных со столбцом «Еда».

 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))
  

Каждый раз, когда появляется фрукт, я хочу заменить название фрукта на «fruit».

Я попытался создать вектор названий фруктов. Затем я просматриваю каждую строку в фрейме данных и там, где строка соответствует фрукту, я хочу заменить имя фрукта на «fruit».

 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") 
    }
  }
}
  

Как мне использовать этот общий формат, чтобы dataframe$Food не просто заполнялся NA?

Комментарии:

1. Вам нужен только цикл for?

2. разве dataframe$Food[which(dataframe$Food %in% fruit_list)] <- «fruit» не обеспечивает эту замену?

3. Вы можете попробовать dataframe %>% mutate(Food = case_when(Food %in% fruit_list ~ str_c(Food, "."), TRUE ~ as.character(Food)))

4. Я не совсем женат на этом формате, но это пример фрейма данных, и тот, с которым я работаю, довольно длинный, поэтому я решил, что это будет лучший формат?

Ответ №1:

С помощью dplyr :

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

Результат:

  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
  

Ответ №2:

Только R base:

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

Ответ №3:

Вам не обязательно dplyr это нужно. Просто используйте:

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

Ответ №4:

Вы можете сделать это в одной строке, используя 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