2015-05-23 23 views
5

Mam ramkę danych składającą się z kolumny n i jedną z nich jest food. food możliwe wartości kolumn to apple, tomato, cabbage, sausage, beer, vodka, potato. Chcę utworzyć nową kolumnę w mojej ramce danych w następujący sposób: jeśli food==apple lub food==tomato lub food==potato, następnie przypisz vegetables, w przeciwnym razie przypisz tylko wartość data$food.R Utwórz nową kolumnę w oparciu o if else condition

Tak więc, jeśli ramka danych jest tak:

ID ..(some other columns).. food 

1       apple 
2       sausage 
3       tomato 
4       cabbage 
5       vodka 

wtedy wynik powinien być następujący:

ID ..(some other columns).. food  category 

1       apple  vegetable 
2       sausage  sausage 
3       tomato  vegetable 
4       cabbage  vegetable 
5       vodka  vodka 

W jaki sposób można to zrobić?

Odpowiedz

4

Chciałbym skopiować zmienną i znaleźć, które wiersze odpowiadają Twojemu kryterium i zastąpić wartości tylko dla tych wierszy. Dodałem również nowy poziom czynników dla uporządkowanej księgowości.

xy <- data.frame(food = sample(c("apple", "tomato", "cabbage", "sausage", "beer", "vodka", "potato"), 50, replace = TRUE)) 

xy$newcol <- xy$food 
levels(xy$newcol) <- c(levels(xy$newcol), "veggy") 
xy[xy$food %in% c("apple", "tomato", "potato"), "newcol"] <- "veggy" 
xy 

     food newcol 
1 apple veggy 
2 vodka vodka 
3 sausage sausage 
4 cabbage cabbage 
5 vodka vodka 
6 potato veggy 
7 cabbage cabbage 
8 cabbage cabbage 
... 
1

Można użyć recode od car, która będzie działać zarówno z „charakterem” i kolumny „czynnik”. W przypadku kolumn "czynnikowych" nieużywane poziomy są usuwane podczas dodawania nowych poziomów.

library(car) 
xy$newcol <- recode(xy$food, "c('apple', 'tomato', 'potato')='veggy'") 

UWAGA: xy z @Roman Lustrik poście

Jeśli używasz data.table, można to zrobić z (aktualizowanie samą kolumnę)

library(data.table) 
setkey(setDT(xy), food)[J(c('apple', 'tomato', 'potato')), food:='veggy'] 
1

Co na ten temat?

# df is your data frame 
veg <- c("tomato", "apple", "potato") 
df$category <- ifelse(df$food %in% veg, "vegetable", df$food)