Как сравнить значения в разных фреймах данных в R (по значениям столбцов)?

#r

#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
....
 

Задача состоит в том, чтобы проверить значения комиссий в фрейме данных 1 путем сравнения результатов торговли с данными в фрейме данных 2. Это означает, что мне нужно найти, чтобы найти код обмена в 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. Совпадают ли фреймы данных одинакового размера один к одному?

2. Нет, фреймы данных имеют разный размер. df1 содержит много разных торговых сделок, но для каждой сделки существует определенный код обмена, который можно сопоставить с кодом обмена в df2. df2 состоит только из уникальных кодов обмена и соответствующих значений комиссий для каждого обмена.

Ответ №1:

Данные

 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)] amp; 
                 duplicated(rbind(df2, df1[, 1:4]))[(NROW(df2)   1):(NROW(df1)   NROW(df2))])
 

Объяснение

Ищите duplicated строки, когда ваши rbind оба df1 и df2 снизу вверх. Однако это также привело бы к неправильному выбору строк, которые дублируются только в df1, но не имеют соответствия df2 . Таким образом, убедитесь, что эти строки также дублируются сверху, когда вы rbind df2 и df1 .

dplyr

 df2$Validated <- TRUE
dplyr::left_join(df1, df2) %>%
  dplyr::mutate(Validated = !is.na(Validated)) 
 

Объяснение

Вы объединяете 2 набора данных таким образом, чтобы все строки из df1 были в окончательном решении и NA возвращались, если совпадений нет. Тогда все, что вам нужно сделать, это заменить NA на FALSE .