2012-07-26 78 views
0

我想匹配一个数据帧中的列的元素与另一个数据帧。R - 检查矢量对其他矢量的元素

考虑以下dataframes:

A=data.frame(par=c('long A story','long C story', 'blabla D'),val=1:3) 
B=data.frame(par=c('Z','D','A'),val=letters[1:3]) 

乙列 '帕' 的每个元素应当对A柱面值进行匹配。 如果匹配,则应在A中标注。 [这会给出一列用于合并A和B的公共值]。因此

期望的结果是:

A=transform(A,label=c('A','NA','D')) 

如何才能做到这一点?

亨克

+0

如果最后一行是:'A =变换(A,标签= C( 'A', '不适用',” D'))'在'transform'调用中使用大写字母A? – thelatemail 2012-07-26 11:06:07

+0

你想按顺序或存在匹配吗? – 2012-07-26 11:40:26

+0

感谢您指出错误thelatemail,a应该是一个在转换调用。 – Henk 2012-07-26 11:46:44

回答

1

做你问什么,尝试

A=data.frame(par=c('long A story','long C story', 'blabla D'),val=1:3) 
B=data.frame(par=c('Z','D','A'),val=letters[1:3]) 
A$label <- NA 
for (x in B$par){ 
    is.match <- lapply(A$par,function(y) grep(x, y)) 
    A$label[which(is.match > 0)] <- x 
} 

(我以为你在你的例子A=transform(a,label=c('A','NA','D'))意味着资本A;在这种情况下,这些完全匹配)。编辑:我看到你做了编辑。他们确实匹配。

上述方法仅适用于只有一个B适合每个A(换句话说,对于B可以有多个A但对A不能有多个B)。这是因为在输出中需要的结构。

+0

我站在敬畏,爱德华......并作为奖金,我不必觉得我的感觉最终会得出这个结论! – Henk 2012-07-26 12:06:52

2

嗨,你可以做这样的事情:

list <- lapply(1:length(B$par),function(x) grep(B$par[x],A$par)) 
list 
[[1]] 
integer(0) 

[[2]] 
[1] 3 

[[3]] 
[1] 1 

label <- rep("NA",length(list)) 

B$par <-as.character(B$par) 

label[unlist(list)] <- B$par[which(list != "integer(0)")] 
label 
[1] "A" "NA" "D" 

A <- transform(A,label=label) 
A 
      par val label 
1 long A story 1  A 
2 long C story 2 NA 
3  blabla D 3  D 

希望这有助于。

1

如果没有一个方便的功能回路:

findkey <- function(key,terms) { 
    result <- sapply(as.character(key),function(x) grepl(x,terms)) 
    result <- apply(result,1,function(x) names(x)[x==TRUE]) 
    result[(lapply(result,length)==0)] <- NA 

    return(unlist(result)) 
} 

应用到当前例如:

A$label <- findkey(B$par,A$par) 

结果:

> A 
      par val label 
1 long A story 1  A 
2 long C story 2 <NA> 
3  blabla D 3  D 
2

我想到的办法:

M <- lapply(strsplit(as.character(A$par), " "), function(x) x[x %in% B$par]) 
M[sapply(M, function(x) {identical(x, character(0))})] <- NA 
A$label <- unlist(M) 
A 

      par val label 
1 long A story 1  A 
2 long C story 2 <NA> 
3  blabla D 3  D 

Microbenchmarked这里和这里的答案是结果:

Unit: microseconds 
     expr  min  lq median  uq  max 
1 EDWARD() 1638.815 1678.934 1698.061 1726.983 4973.823 
2 SONAL() 705.348 725.874 734.738 747.334 2085.721 
3  TLM() 268.705 281.300 287.831 294.362 1465.744 
4 TRINKER() 156.278 168.407 173.538 177.737 1331.391 

enter image description here