首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用apply在两个数据帧之间进行所有与所有比较

使用apply在两个数据帧之间进行所有与所有比较
EN

Stack Overflow用户
提问于 2021-01-20 11:40:39
回答 1查看 46关注 0票数 0

我使用的是R,我有三个数据帧,有两个相同的列(ID和时间戳),但行数不同。

代码语言:javascript
运行
复制
ID       timeStamp
a   2018-04-17 10:47:45
a   2018-04-17 10:47:48
a   2018-04-17 10:47:48
a   2018-04-17 10:47:48
a   2018-04-17 10:49:23
a   2018-04-17 10:50:02
a   2018-04-17 10:51:34
a   2018-04-17 10:51:36
a   2018-04-17 10:51:38


ID       timeStamp
b   2018-04-17 10:32:17
b   2018-04-17 10:46:18
b   2018-04-17 10:47:18
b   2018-04-17 10:49:20
b   2018-04-17 10:52:22
b   2018-04-17 10:55:25
b   2018-04-17 10:57:29

ID       timeStamp
c   2018-04-17 10:32:17
c   2018-04-17 10:46:18
c   2018-04-17 10:47:18
c   2018-04-17 10:49:20
c   2018-04-17 10:52:22
c   2018-04-17 10:55:25

我想要比较三个数据帧中的所有时间戳值,并根据数据帧A、B和C中的观测值在特定时间范围内的次数来计算点。例如,如果两个obs在5分钟范围内,我想分配10分。如果值完全相同,它将得到5分。否则,将不会添加任何分数。我想得到两个数据帧之间的总分

我尝试使用for循环来创建模型,但是当我比较大量的行时,它会花费很长的时间。

代码语言:javascript
运行
复制
m= 0
n= 0
for (i in 1:nrow(A)){
  for (j in 1:nrow(B)){if (difftime(A[i,"tStamp"],B[j,"tStamp"],units = "secs") < 300 & A(Role1[i,"tStamp"],B[j,"tStamp"],units = "secs") >0 ) {m=m+10}
else if ( difftime(A[i,"tStamp"],B[j,"tStamp"],units = "secs") == 0){m=m+5}
else if (difftime(B[j,"tStamp"],A[i,"tStamp"],units = "secs") < 300 & difftime(B[j,"tStamp"],A[i,"tStamp"],units = "secs") >0) {n=n+10}
else if ( difftime(B[j,"tStamp"],A[i,"tStamp"],units = "secs") == 0){n=n+5}}

有没有使用apply函数来做这件事的好方法呢?我相信它会比for循环更高效、更快。预期输出将如下所示

代码语言:javascript
运行
复制
ID1     ID2               m              n
A        B     
A        C      
B        C   

M和n将是循环后两个数据帧的关系的总添加点。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-20 14:16:42

我不确定您想要什么样的最终输出,但首先您可以在difftime中使用outer

代码语言:javascript
运行
复制
mat <- outer(df1$timeStamp, df2$timeStamp, difftime, units = 'mins')
mat

#Time differences in mins
#      [,1] [,2] [,3]  [,4]   [,5]  [,6]  [,7]
# [1,] 15.5 1.45 0.45 -1.58 -4.617 -7.67 -9.73
# [2,] 15.5 1.50 0.50 -1.53 -4.567 -7.62 -9.68
# [3,] 15.5 1.50 0.50 -1.53 -4.567 -7.62 -9.68
# [4,] 15.5 1.50 0.50 -1.53 -4.567 -7.62 -9.68
# [5,] 17.1 3.08 2.08  0.05 -2.983 -6.03 -8.10
# [6,] 17.8 3.73 2.73  0.70 -2.333 -5.38 -7.45
# [7,] 19.3 5.27 4.27  2.23 -0.800 -3.85 -5.92
# [8,] 19.3 5.30 4.30  2.27 -0.767 -3.82 -5.88
# [9,] 19.4 5.33 4.33  2.30 -0.733 -3.78 -5.85

在这里,您可能希望获取可用值的绝对值,并将小于5的值转换为10,然后执行相应的计算。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65802756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档