我写了以下函数,它的工作原理 . 但是,当 df1
有1700行时,它非常慢, df2
有70000行 . 反正有提高效率吗?
rowcheck <- function(df1, df2){
apply(df1, 1, function(x) any(apply(df2, 1, function(y) all(y==x))))
}
我写这个函数应用的一个例子是:我想检查df1中的每一行是否包含在df2中的一行:
df1=data.frame(a=c(1:3),b=c("a","b","c"))
df2=data.frame(a=c(1:6),b=rep(c("a","b","c"),2))
对于df1的每一行,我想检查它是否包含在df2中的一行中 . 我想将函数返回为长度为nrow(df1)的逻辑向量 .
谢谢您的帮助 .
3 回答
一种方法是将行粘贴在一起,并将它们与
%in%
进行比较 . 结果是一个逻辑向量,长度为nrow(df1)
,如请求的那样 .尝试:
它会告诉你
df1
中的哪些行号出现在df2
中 . 如果你想要一个像Richard Scriven的答案那样的逻辑原子向量,试试吧它也更快,因为它使用内部C函数
duplicated
(我的是rowcheck2
)只是想在这个查询上给我两分钱 . 基于plyr的解决方案:
..将针对df2(相对于所有列)检查df1的每一行,并给出df2中包含的df1的行数 .