【问题标题】:R Programming - Comparing a value form each row of a data.frame with each row of another data.frameR Programming - 将 data.frame 的每一行的值与另一个 data.frame 的每一行进行比较
【发布时间】: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


【解决方案1】:

我会使用merge()

df3 <- merge(df1, df2, by.x = 'id', by.y = 'id')
> df3
           id              date.x              date.y
1 CA8058402571009 2015-07-10 15:50:20 2015-07-10 15:49:23
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:29
4 CA8058402571009 2015-07-10 16:51:54 2015-07-10 15:49:23
5 CA8058402571009 2015-07-10 16:51:54 2015-07-10 16:31:42
6 CA8058402571009 2015-07-10 16:51:54 2015-07-10 16:51:29
7 CA8058409291009 2015-07-10 15:25:31 2015-07-10 16:34:34
8 CA8323300811005 2015-07-10 16:18:52 2015-07-10 16:18:37
9 CA8323300811005 2015-07-10 16:54:03 2015-07-10 16:18:37

【讨论】:

  • 工作完美。显然,我试图让事情变得困难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多