我的数据框由n
列组成,其中一个是food
。 food
列可能的值为apple
,tomato
,cabbage
,sausage
,beer
,vodka
,potato
。我想在data
数据框中创建一个新列,如下所示:food==apple
或food==tomato
或food==potato
,然后指定vegetables
,否则只指定{{ {1}}价值。
所以,如果数据框是这样的:
data$food
然后结果如下:
ID ..(some other columns).. food
1 apple
2 sausage
3 tomato
4 cabbage
5 vodka
我该怎么做?
答案 0 :(得分:4)
我会复制变量并找到哪些行符合您的标准,并仅为这些行替换值。我还为整洁的簿记添加了一个新的因子水平。
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 :(得分:1)
您可以使用recode
中的car
,它可以同时使用'character'和'factor'列。对于'factor'列,在添加新级别时会删除未使用的级别。
library(car)
xy$newcol <- recode(xy$food, "c('apple', 'tomato', 'potato')='veggy'")
注意:xy
来自@Roman Lustrik的帖子
如果您使用data.table
,可以使用(更新同一列)来完成此操作
library(data.table)
setkey(setDT(xy), food)[J(c('apple', 'tomato', 'potato')), food:='veggy']
答案 2 :(得分:1)
这个怎么样?
# df is your data frame
veg <- c("tomato", "apple", "potato")
df$category <- ifelse(df$food %in% veg, "vegetable", df$food)