很遗憾,找不到相关的答案。希望能有所帮助。
让我们假设我们在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中如何做到这一点的任何想法?
非常感谢!
答案 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))])
说明
当duplicated
和rbind
的{{1}}从下到上都在df1
行中查找。但是,这也会错误地选择行,这些行仅在df1中重复但在df2
中没有对应关系。因此,当您df2
rbind
和df2
时,请确保这些行也是从顶部开始的重复行。
dplyr
df1
说明
您以如下方式加入2个数据集:df2$Validated <- TRUE
dplyr::left_join(df1, df2) %>%
dplyr::mutate(Validated = !is.na(Validated))
中的所有行都在最终解决方案中,如果没有匹配项,则返回df1
。然后,您要做的就是将NA
替换为NA
。