Свертывание группы строк в одну строку с помощью оператора if внутри цикла for в R - PullRequest
6 голосов
/ 11 апреля 2019

У меня есть датафрейм с колонкой «Еда».

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

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

Ответы [ 4 ]

3 голосов
/ 11 апреля 2019

Только база R:

dataframe$Food <- 
sapply(dataframe$Food,
        function(x,fruit_list) ifelse(x %in% fruit_list, "fruit", as.character(x) ),
        fruit_list = fruit_list ) 
2 голосов
/ 11 апреля 2019

С 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
0 голосов
/ 11 апреля 2019

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

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

dataframe$Food <- ifelse(dataframe$Food %in% fruit_list, "Fruit", as.character(dataframe$Food))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...