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