我有一个大型数据表,如下所示:
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"]
等等listb
和listd
。
它也不起作用function approach
(对于我的大数据表来说也可能太慢,因为它会有很多elseif
个子句)。我写道:
matchfun <- function(value){
if (var1 %in% lista){
value <- as.character(a)} else {
return(value)}}
非常欢迎任何关于如何将因子/类别分配给值组的想法或评论。
答案 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
(但应该)。