#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