这可能是一个愚蠢的想法,但我还是要问它......
我面临以下问题。我想在DT B上加入DT A.
A<-data.table(a=c(1,2,3), b=c(4,5,6), key="a,b")
B<-data.table(a=c(NA, 3, 3), b=c(6, NA, 6), c=c(5,6,7), key="a,b")
B[A, mult="first"]
a b c
1: 1 4 NA
2: 2 5 NA
3: 3 6 7
给出了我期待的结果。但是有没有办法获得通配符(在示例中我为通配符放置了NA,它也可以在连接中使用“*”)。
在上面的例子中,我希望:
a b c
1: 1 4 NA
2: 2 5 NA
3: 3 6 6
这是因为第二行B“接受”表A中列b的所有值。
有没有很好的方法来获得理想的结果?
修改 在考虑这个问题很长一段时间没有令人满意的结果后,我会感激一些想法。为此,让我解释一下比上述情况更广泛的情况: 我想把人分成小组。一个人应该被分类为满足其要求的第一组。并非所有群体都要求提供相同的人物属性。当该组没有特定特征的要求时,允许所有值。
非常感谢任何建议(不必涉及data.tables)。
EDIT2: 我终于解决了这个问题,包括通配符支持,随时向我指出改进
classification<-list(
list(
list("Michael", "Thomas"), list("Brown"), list("*"), list("A")
),
list(
list("*"), list("Red"), list(15, 16, 17, 18), list("B")
),
list(
list("Theresa"), list("Red"), list("*"), list("C")
),
list(
list("*"), list("Blond"), list("*"), list("D")
),
list(
list("*"), list("*"), list("*"), list("E")
)
)
participants<-data.table(name=c("Thomas", "Michael", "Sebastian", "Theresa", "Phil"),
hair=c("Brown", "Blond", "Black", "Red", "Grey"),
age=c(15, 25, 15, 16, 15))
configToMappingTable<-function(config, dt){
for(col in 1:(length(config[[1]])-1)){
colVal<-unique(unlist(dt[, col, with=F]));
for(row in 1:length(config)){
config[[row]][[col]]<-lapply(config[[row]][[col]], glob2rx);
config[[row]][[col]]<-unlist(lapply(config[[row]][[col]], function(x) as.list(colVal[grep(x, colVal)])), recursive=F);
}
}
res<-rbindlist(lapply(config, function(x) do.call(CJ, x)));
res<-res[, lapply(.SD, as.character)];
return(res[!duplicated(res[, 1:(ncol(res)-1), with=F])]);
}
mapping<-configToMappingTable(classification, participants)
setnames(mapping, c("name", "hair", "age", "group"))
mapping[, age:=as.numeric(age)]
setkey(participants, name, hair, age);
setkey(mapping, name, hair, age);
participants[mapping, group:=i.group]