【发布时间】:2021-04-24 10:01:03
【问题描述】:
我正在使用 R,并且我有三个数据帧,其中包含两个相同的列(ID 和时间戳),但行数不同。
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 循环制作模型,但是当我比较大量行时需要很长时间。
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 循环更有效和更快。预期的输出将像
ID1 ID2 m n
A B
A C
B C
m 和 n 将是循环后两个数据帧关系的总加点。 任何帮助将不胜感激。
【问题讨论】:
-
if不是矢量化运算符,因此您的if (difftime...)逻辑不正确。此外,即使您要使用ifelse对比较进行矢量化,当m != n时,您也无法将m元素的矢量与n元素的矢量进行比较。 -
Inkyu,我认为,如果您根据此示例数据提供预期的输出,将会有所帮助。
-
@r2evans 感谢您的快速和友好的 cmets。我添加了更详细的解释和我的预期输出。再次感谢您的帮助!
标签: r loops comparison apply