r - 使用 R 中的嵌套 for 循环更快地替代成对比较
问题描述
我试图找到一个更快的替代方法来比较数据帧X中的每个观测值i和观测值j。例如,运行以下代码
for(i in 1:nrow(X)){
for(j in 1:nrow(X)){
if ( (sum(c(X$Feature1[i], X$Feature1[j])) == 0)&& ((X$Feature2[i] == X$Feature2[j])|(X$Feature3[i] == X$Feature3[j]) ) ){
X$match[i]<-1
}}}
运行 20,000 个左右的观测值需要相当长的时间。R中是否有任何人都知道的排序/比较算法?在此先感谢您的时间!
解决方案
您可以在 sql 中或在 R 中使用sqldf
.
X$match <- seq(nrow(X))
library(sqldf)
X$match <- sqldf("
select sum(b.Feature1 is not null) > 0 as match
from X a
left join X b
on a.Feature1 + b.Feature1 = 0
and (
a.Feature2 = b.Feature2
or a.Feature3 = b.Feature3)
group by a.match
")[[1]]
基本 R 版本可能是
X$match <- as.numeric(
sapply(seq(nrow(X)), function(i){
any( (X$Feature1[i] + X$Feature1 == 0)
& (
(X$Feature2[i] == X$Feature2)
| (X$Feature3[i] == X$Feature3)))}))
推荐阅读
- r - popbio - 为什么它不阅读我的生育专栏
- mesos - DCOS 服务无故卡住
- javascript - 实例化函数时如何将局部变量保存在内存中?
- tensorflow - Keras 模型在本地运行良好,但无法在 Flask API 上运行
- android - 在 OnViewCreated 变量中分配函数值
- java - 竞争条件,较小的请求优先于较大的 Java 8 异步
- spring-boot - 通过 Spring Security 的 Active Directory 身份验证返回由 LDAP 引起的有效用户的错误凭据:错误代码 49
- c# - 在 C# 和 ASP.NET MVC 中将音频直接从 URL 流式传输到 Web 浏览器?
- django - Django REST 框架中的 MultiPartParser 和 FormParser 是什么概念?
- amazon-web-services - API Gateway + Lambda 响应时间极慢