R的专家。
我有两个数据帧。
dataframe one:
df1 <- c("xx", "bb", "zz")
数据帧二:
df2 <- data.frame(A=c("xx", "be", "zz", "jj"), B=c("xyx, uu, zz", "uu, zbbz, zbz, ccc", "cc, zzx", "ddd"), C=c("bbbb", "yyy", "xxq", "ooo"), D=c("ooo", "yyy", "ccc", "zoz"))
因此,df2如下:
A B C D
1 xx xyx, uu, zz bbbb ooo
2 be uu, zbbz, zbz, ccc yyy yyy
3 zz cc, zzx xxq ccc
4 jj ddd ooo zoz
我想将x与y匹配以获得新的数据帧。看看Stackoverflow的答案,我学会了如何做一些精确的匹配。但在目前的情况下,我想做完全匹配和部分匹配。在我看来,“grep”可能有所帮助,但我无法让它为我的案例工作,请帮助。
在df1中,我必须使用三个术语来匹配“xx”,“bb”和“zz”。而不是在df2中搜索精确的xx,bb,zz。我想检查这些术语是否可以在df2的A列和B列中找到,它可能包含完全匹配和部分匹配。
例如,我会考虑
xx匹配第1行(与A1完全匹配)
bb仅匹配第2行(部分 与B2)匹配
zz匹配第1行 和第3行(部分匹配B1和 与A3完全匹配,部分匹配 与B3一起),
因为zz与两个匹配 两个项目,我想排序一个 在决赛中首先完全匹配 数据帧,即第一行显示的row3, 第1行显示在下一个。
第4行 df2与任何事都不匹配 表,所以,它不会出现 在最终的数据框中。
最后,我想通过将相应的df2添加到df1来获取数据帧,如下所示:
V1 A B C D
1 xx xx xyx, uu, zz bbbb ooo
2 bb be uu, zbbz, zbz, ccc yyy yyy
3 zz zz cc, zzx xxq ccc
4 zz xx xyx, uu, zz bbbb ooo
在这种情况下可以使用grep或sort吗?请指出更聪明的方法。感谢。
答案 0 :(得分:2)
这应该可以帮助你:
dfrPerVal<-lapply(df1, function(dfrPartFor){
whereFoundA<-grep(dfrPartFor, df2$A, fixed=TRUE)
whereFoundB<-grep(dfrPartFor, df2$B, fixed=TRUE)
retval<-cbind(1=dfrPartFor, df[union(whereFoundA, whereFoundB),]
xmatch<-which((retval$A==dfrPartFor) | (retval$B==dfrPartFor))
if(length(xmatch) > 0)
{
retval<-rbind(retval[xmatch, ], retval[-xmatch, ])
}
return(retval)
})
finalResult<-do.call(rbind, dfrPerVal)
毫无疑问,更好的解决方案......