如何比较R中不同数据帧中的值(按列值)?

时间:2019-04-18 13:35:25

标签: r

很遗憾,找不到相关的答案。希望能有所帮助。

让我们假设我们在R中有两个数据帧。

第一个数据框显示包含交易编号和值,费用值和交易代码的交易结果。

> df1
  EXCH Fee1 Fee2 Fee3  Trade Numb     Trade Value
1 CHD   2   20    1        123            5639
2 BHD  10   25    2        231            3423
3 SPP   5   23    1        523           (3636)
4 HSB  11   2     3        425            ....
5 HSB  11   2     3        233
6 SPP   5   23    1        124
7 CHD   2   20    1        123  
....

第二个数据框显示特定交易的正确费用值。

> df2
 EXCH Fee1 Fee2 Fee3
1 CHD   2   20    1
2 BHD  10   25    2
3 SPP   5   23    1
4 HSB  11   2     3
....

任务是通过将交易结果与数据框2中的数据进行比较来验证数据框1中的费用值。这意味着我需要找到在df 1中的交易代码并找到相同的费用值在df2中交换代码。最后我应该得到这样的东西:

 > df1
  EXCH Fee1 Fee2 Fee3  Trade Numb   Validation
1 CHD   2   20    1        123          TRUE
2 BHD  10   25    2        231          TRUE
3 SPP   5   22    5        523          FALSE
4 HSB  11   2     3        425          TRUE
5 HSB  11   2     3        233          TRUE
6 SPP   5   23    1        124          TRUE
....                                    ...

数据帧的大小不同,因为df2仅包含每个附件的基准,而df1包含许多贸易交易的结果。

关于在R中如何做到这一点的任何想法?

非常感谢!

1 个答案:

答案 0 :(得分:0)

数据

set.seed(1)
df1 <- data.frame(EXCH = LETTERS)
df1 <- rbind(df1, df1, df1)
df1 <- cbind(df1, data.frame(Fee1 = sample(26 * 3), 
                             Fee2 = sample(26 * 3), 
                             Fee3 = sample(26 * 3), 
                             Trade_Num = 1:(26*3)))
df2 <- df1[1:26, 1:4]

基础

df1$Validated <- duplicated(rbind(df1[, 1:4], df2), fromLast = T)[1:NROW(df1)] & 
                 duplicated(rbind(df2, df1[, 1:4]))[(NROW(df2) + 1):(NROW(df1) + NROW(df2))])

说明

duplicatedrbind的{​​{1}}从下到上都在df1行中查找。但是,这也会错误地选择行,这些行仅在df1中重复但在df2中没有对应关系。因此,当您df2 rbinddf2时,请确保这些行也是从顶部开始的重复行。

dplyr

df1

说明

您以如下方式加入2个数据集:df2$Validated <- TRUE dplyr::left_join(df1, df2) %>% dplyr::mutate(Validated = !is.na(Validated)) 中的所有行都在最终解决方案中,如果没有匹配项,则返回df1。然后,您要做的就是将NA替换为NA