加入时的通配符

时间:2015-04-21 15:44:20

标签: r data.table

这可能是一个愚蠢的想法,但我还是要问它......

我面临以下问题。我想在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的所有值。

有没有很好的方法来获得理想的结果?

修改 在考虑这个问题很长一段时间没有令人满意的结果后,我会感激一些想法。为此,让我解释一下比上述情况更广泛的情况: 我想把人分成小组。一个人应该被分类为满足其要求的第一组。并非所有群体都要求提供相同的人物属性。当该组没有特定特征的要求时,允许所有值。

The image below shows an example

非常感谢任何建议(不必涉及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]

0 个答案:

没有答案