基于向量和更新列的组值

时间:2019-03-27 02:34:50

标签: r dplyr

我正在尝试根据预定义的向量对各种值进行分组,然后更新一列。

样本数据

df <- data.frame(ID = 1:5, Type = c("Windows", "Windows Server", "Cat", "Dog", "Eggs"))

it <- c("Windows", "Windows Server")
animal <- c("Cat", "Dog")
food <- c("Eggs")

我尝试过但失败了

df$Grouping <- gsub(it, "IT", df$Type)
  

错误:样式> 1

有效但费时的方法

使用dplyr变异,我将能够实现想要的目标,但是由于向量中有多个元素,因此它的运行时间非常长。

df %>% mutate(Grouping = ifelse(Type == "Windows", "IT", 
                                ifelse ...))

预期输出

ID           Type         Grouping
1  1        Windows          IT
2  2 Windows Server          IT
3  3            Cat        Animal
4  4            Dog        Animal
5  5           Eggs        Food

谢谢!

3 个答案:

答案 0 :(得分:1)

创建一个预定义矢量的列表,然后检查列表中的哪个元素在df$Type内包含项

mylist = mget(c("animal", "food", "it"))
names(mylist)[max.col(t(sapply(df$Type, function(x) lapply(mylist, function(y) x %in% y))))]
#[1] "it"     "it"     "animal" "animal" "food"

答案 1 :(得分:0)

一种选择是为映射创建list(或data.frame),然后执行left_join

map <- list(
    it = c("Windows", "Windows Server"),
    animal = c("Cat", "Dog"),
    food = c("Eggs"))

library(dplyr)   
df %>% left_join(stack(map), by = c("Type" = "values"))
#  ID           Type    ind
#1  1        Windows     it
#2  2 Windows Server     it
#3  3            Cat animal
#4  4            Dog animal
#5  5           Eggs   food

答案 2 :(得分:0)

发布的问题没有多大意义。具体地说,对于样本数据,存储独立类型向量并不比将类型存储为初始数据帧的属性更简单。也许您可以添加一些颜色,以提供有关问题性质的更多细节。

这样说,假设您的问题是查找向量存储在不同的源中并且需要独立加载,则简单的循环就足够了。 (我使用的是data.table,因为我什至都不记得如何使用原始的data.frame了):

df <- data.table(ID = 1:5, Type = c("Windows", "Windows Server", "Cat", "Dog", "Eggs"))
it <- c("Windows", "Windows Server")
animal <- c("Cat", "Dog")
food <- c("Eggs")

lookup.names <- c("it", "animal", "food")
for (z in 1:length(lookup.names) ) {
    lookup <- get(lookup.names[z]) #maybe need to do some more sophisticated load, like from a file or database
    df[Type %in% lookup, Grouping := lookup.names[z]]
}