R编程 - 将data.frame的每一行的值与另一个data.frame的每一行进行比较。

时间:2015-08-24 17:06:24

标签: r

我有两个数据帧(DF1和DF2),我试图比较其中的值。

对于DF1中的每一行,我想比较DF2中每一行的第1列和第1列。对于每个匹配(DF1中的每个值可能有很多),我想用另外一个数据框(DF3)填充比较值所在行的值和DF2中匹配行的值。

以下是我一直在处理的代码。我知道我应该避免循环,不要介意嵌套循环,但我无法弄清楚任何其他方式或找到任何示例。

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和事件结束的所有可能时间的行。

感谢任何帮助。

1 个答案:

答案 0 :(得分: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