【发布时间】:2015-08-24 17:06:24
【问题描述】:
我有两个数据框(DF1 和 DF2),我正在尝试比较其中的值。
对于 DF1 中的每一行,我想比较 DF2 中每一行的第 1 列和第 1 列。对于每个匹配项(来自 DF1 的每个值都可以有多个),我想用正在比较的值所在行的值和 DF2 中匹配行的值填充另一个数据框 (DF3)。
以下是我一直在处理的代码。我知道我应该避免循环,更不用说嵌套循环,但我想不出任何其他方式或找到任何示例。
DF3 <- data.frame("id","DF1Timestamp","DF2Timestamp")
head(df1)
id timestamp
1 CA8058409291009 2015-07-10 15:25:31
2 CA8058402571009 2015-07-10 15:50:20
3 CA8323300811005 2015-07-10 16:18:52
4 CA8058402571009 2015-07-10 16:51:54
5 CA8323300811005 2015-07-10 16:54:03
head(df2)
id timestamp
1 CA8058402571009 2015-07-10 15:49:23
2 CA8323300811005 2015-07-10 16:18:37
3 CA8058402571009 2015-07-10 16:31:42
4 CA8058409291009 2015-07-10 16:34:34
5 CA8058402571009 2015-07-10 16:51:29
#sets the index used to identify row numbers in the DF3 table
index <- 1
for (i in 1:nrow(DF1)){
for (j in 1:nrow(DF2)){
if ((DF1[i,3]) == (DF2[j,3])) {
DF3 [[i,1]] <- (DF1[i,3])
DF3 [[i,2]] <- (DF1[i,2])
DF3 [[i,3]] <- (DF2[j,3])
index <- index +1
}
else{
#do nothing
}
}
}
我得到的只是结果
head(DF3)
ID. DF1timestamp DF2timestamp
1 <NA> <NA> <NA>
2 <NA> <NA> <NA>
3 <NA> <NA> <NA>
4 <NA> <NA> <NA>
5 <NA> <NA> <NA>
6 <NA> <NA> <NA>
我想要的是这个。
head(DF3)
id DF1Timestamp DF2Timestamp
1 CA8058409291009 2015-07-10 15:25:31 2015-07-10 16:34:34
2 CA8058402571009 2015-07-10 15:50:20 2015-07-10 16:31:42
3 CA8058402571009 2015-07-10 15:50:20 2015-07-10 16:51:54
4 CA8323300811005 2015-07-10 16:18:52 2015-07-10 16:18:37
5 CA8058402571009 2015-07-10 16:51:54 2015-07-10 15:49:23
6 CA8058402571009 2015-07-10 16:51:54 2015-07-10 16:31:42
7 CA8323300811005 2015-07-10 16:54:03 2015-07-10 16:18:37
此表显示的是在给定 ID 处发生的第一次和事件以及事件结束的所有可能时间的一行。
感谢任何帮助。
【问题讨论】:
-
请包含所需的结果?
-
看起来
DF1有六行,因为您的结果以那么多行结束。有一个可重复的例子会更清楚:stackoverflow.com/a/28481250/1191259 -
看起来你正在循环查看
merge(df1, df2)所做的事情 -
@richard,我刚刚更新了。
-
@Frank,我得到的输出只是一个使用 head() 的示例。我添加了一张我提供的示例 DF1 和 DF2 表应该得到的结果表。
标签: r