【问题标题】:How to compare values between two dataframe如何比较两个数据框之间的值
【发布时间】:2018-04-17 04:48:25
【问题描述】:

我在下面提到了两个数据框:

我想将 DF_2 的每一列与对应于唯一 ID 的 DF_1 进行比较,在 Dif 列中,我想获得 DF_2 和 DF_1 之间以及 ST、ST2 和 ST3 列中的确切时间差(分钟)所需输出我想将 DF_2 的相应列与 DF_1 匹配。

DF_1

ID     Date                  Val1     Val2   Val3
AB-55  2017-01-04 18:25:14   adj.f@f  ad2er  25
AB-78  2017-01-08 08:48:14   arj.t@y  ar8ey  258
AB-48  2017-01-09 21:25:45   edR.u@t  wu5eu  75

DF_2

ID     Date                  Val1     Val2   Val3
AB-55  2017-01-04 18:25:14   adj.f@f  ad2er  25
AB-78  2017-01-08 08:58:14   arj.t@y  ar7ey  25
AB-48  2017-01-09 21:25:45   edR.u@t  wu5eu  75

所需的数据框:

ID     Date                Dif   Val1    ST   Val2  ST2   Val3 ST3
AB-55  2017-01-04 18:25:14 0     adj.f@f T    ad2er T     25   T
AB-78  2017-01-08 08:48:14 10    arj.t@y T    ar8ey F     258  F
AB-48  2017-01-09 21:25:45 0     edR.u@t T    wu5eu T     75   T

【问题讨论】:

  • 如果数据帧具有相同顺序的相同行,则 difftime(DF_1$Date, DF_2$Date, units = "mins") 应提供差异向量
  • @griffinevo 原始序列不一样...只能通过ID 识别。
  • inner_join(DF_1, DF_2, by = 'ID') %>% mutate(...)
  • @Roy1245 刚刚看到您的评论,请在下面尝试我的答案 - 如果有效,请接受,如果没有评论,我会尝试找到解决方案 - 一切顺利!

标签: r dataframe dplyr tidyr


【解决方案1】:

这是一个使用difftime 的解决方案,假设您在每个数据帧中都有相同的行

DF_1$Dif <- as.numeric(difftime(DF_2$Date, DF_1$Date, units = "mins"))

...和数据框:

> DF_1
     ID                Date Dif
1 AB-55 2017-01-04 18:25:14   0
2 AB-78 2017-01-08 08:48:14  10

或者,如果行不匹配,首先实现merge

DF_3 <- merge(DF_1, DF_2, by = "ID", all.x = T, all.y = T)
DF_3$Dif <- as.numeric(difftime(DF_3$Date.y, DF_3$Date.x, units = "mins"))

结果……

> DF_3
     ID              Date.x              Date.y Dif
1 AB-55 2017-01-04 18:25:14 2017-01-04 18:25:14   0
2 AB-78 2017-01-08 08:48:14 2017-01-08 08:58:14  10
3 AB-89 2017-01-08 10:35:14                <NA>  NA
4 AD-87                <NA> 2017-01-08 06:15:12  NA

按照您对问题所做的修改中的要求包括其他列

# Here I'm just making your dataframe, please provide code to make reproducible data where possible in the future
DF_1 <- data.frame("ID" = c("AB-55", "AB-78", "AB-89"), "Date" = c("2017-01-04 18:25:14", "2017-01-08 08:48:14", "2017-01-08 10:35:14")) 
DF_2 <- data.frame("ID" = c("AB-55", "AB-78", "AD-87"), "Date" = c("2017-01-04 18:25:14", "2017-01-08 08:58:14", "2017-01-08 06:15:12")) 

DF_1$Val1 <- c("adj.f@f", "adj.t@y", "edR.u@t")
DF_2$Val1 <- c("adj.f@f", "adj.t@y", "edR.u@t")

DF_1$Val2 <- c("ad2er", "ar7ey", "wu5eu")
DF_2$Val2 <- c("ad2er", "ar8ey", "wu5eu")

DF_1$Val3 <- c(25, 258, 75)
DF_2$Val3 <- c(25,  25, 75)

# The merge and difftime part remains
DF_3 <- merge(DF_1, DF_2, by = "ID", all.x = T, all.y = T)
DF_3$Dif <- as.numeric(difftime(DF_3$Date.y, DF_3$Date.x, units = "mins"))

# True/False part
DF_3$ST1 <- DF_3$Val1.x == DF_3$Val1.y
DF_3$ST2 <- DF_3$Val2.x == DF_3$Val2.y
DF_3$ST3 <- DF_3$Val3.x == DF_3$Val3.y

还有数据框

DF_3


> DF_3
     ID              Date.x  Val1.x Val2.x Val3.x              Date.y  Val1.y Val2.y Val3.y Dif  ST1   ST2   ST3
1 AB-55 2017-01-04 18:25:14 adj.f@f  ad2er     25 2017-01-04 18:25:14 adj.f@f  ad2er     25   0 TRUE  TRUE  TRUE
2 AB-78 2017-01-08 08:48:14 adj.t@y  ar7ey    258 2017-01-08 08:58:14 adj.t@y  ar8ey     25  10 TRUE FALSE FALSE
3 AB-89 2017-01-08 10:35:14 edR.u@t  wu5eu     75                <NA>    <NA>   <NA>     NA  NA   NA    NA    NA
4 AD-87                <NA>    <NA>   <NA>     NA 2017-01-08 06:15:12 edR.u@t  wu5eu     75  NA   NA    NA    NA

【讨论】:

  • @grifflinevo 谢谢,但我想用 DF_1 检查 DF_2 的其他列,并想知道状态 T(真)或 F(假)。
  • 查看编辑 - 添加那些按需工作的列(不要低估提供代码以生成可重现数据的价值)
猜你喜欢
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多