根据每个因子的一组值分配id / factor / categories

时间:2015-04-01 17:29:13

标签: r data.table categories

我有一个大型数据表,如下所示:

id var1 var2
1   1   a
2   2   d
3   6   d
4   4   b
5   6   d
6   8   a

我需要根据var2中的值在var1中指定一个类别。对于每个类别中包含的var1值,类别不遵循任何顺序。例如:

lista <- c(1,5,7)
listb <- c(4,9)
listd <- c(2,6)

我尝试过两种不成功的方法。 使用which函数:

which: DT[which(var1 %in% lista), var2 := "a"]等等listblistd

它也不起作用function approach(对于我的大数据表来说也可能太慢,因为它会有很多elseif个子句)。我写道:

matchfun <- function(value){
  if (var1 %in% lista){
    value <- as.character(a)} else {
    return(value)}}

非常欢迎任何关于如何将因子/类别分配给值组的想法或评论。

1 个答案:

答案 0 :(得分:3)

我建议在这里合并。让DT成为原始数据表。

DT <- data.table(id=1:6,var1=c(1,2,6,4,6,8))

首先,您需要将映射存储在表中:

matchDT <- rbindlist(list( 
  data.table(var1=lista,var2="a"),
  data.table(var1=listb,var2="b"),
  data.table(var1=listd,var2="d")
))

然后你可以合并,可选择将id设置为关键,然后恢复原始排序。

setkey(DT,var1)
DT[matchDT,var2:=var2,nomatch=FALSE]
setkey(DT,id)

结果是

   id var1 var2
1:  1    1    a
2:  2    2    d
3:  3    6    d
4:  4    4    b
5:  5    6    d
6:  6    8   NA

最后一个值为NA,因为您的lista对象不包含8(但应该)。