R dplyr добавляет повторные значения в full-join - PullRequest
0 голосов
/ 17 июня 2019

Аналогично этот вопрос, но в R. Full-Join добавляет повторяющиеся значения при определенных обстоятельствах, а именно одна таблица имеет повторяющееся значение в столбце «по», а другая таблица - нет.

> df1 = data.frame(A=c(1,2,2,3), B=letters[1:4])
> df2 = data.frame(A=c(2,3,3,3), C=LETTERS[1:4])
> full_join(df1, df2, by="A") %>% arrange(A) %>% select(A,B,C)
  A B    C
1 1 a <NA>
2 2 b    A
3 2 c    A
4 3 d    B
5 3 d    C
6 3 d    D

Вот приложение, где это неприятная проблема.У меня есть две бухгалтерские книги с транзакциями по дате.Каждая учетная запись имеет даты с несколькими транзакциями.Если я попытаюсь объединить бухгалтерские книги, они будут полностью испорчены.

acct1 = data.frame(
  Date=as.Date(c("2019/1/1", "2019/1/2", "2019/1/2", "2019/1/3")), 
  Amount=c(10, -20, -1, 25)
  )
acct1
#>         Date Amount
#> 1 2019-01-01     10
#> 2 2019-01-02    -20
#> 3 2019-01-02     -1
#> 4 2019-01-03     25

acct2 = data.frame(
  Date=as.Date(c("2019/1/2", "2019/1/3", "2019/1/3", "2019/1/3")), 
  Amount=c(7, 0, -7, 0)
  )
acct2
#>         Date Amount
#> 1 2019-01-02      7
#> 2 2019-01-03      0
#> 3 2019-01-03     -7
#> 4 2019-01-03      0

dplyr::full_join(acct1, acct2, by="Date", suffix=c(".ACCT1", ".ACCT2"))
#>         Date Amount.ACCT1 Amount.ACCT2
#> 1 2019-01-01           10           NA
#> 2 2019-01-02          -20            7
#> 3 2019-01-02           -1            7
#> 4 2019-01-03           25            0
#> 5 2019-01-03           25           -7
#> 6 2019-01-03           25            0

Создано в 2019-06-17 пакетом Представить (v0.3.0)

Редактировать

Я только что нашел этот вопрос, и он может иметь решение.

Работает

acct1 = data.frame(
  Date=as.Date(c("2019/1/1", "2019/1/2", "2019/1/2", "2019/1/3")), 
  Amount=c(10, -20, -1, 25)
  )
acct1 = acct1 %>% mutate(rownum=row_number())
#> Error in acct1 %>% mutate(rownum = row_number()): could not find function "%>%"
acct1
#>         Date Amount
#> 1 2019-01-01     10
#> 2 2019-01-02    -20
#> 3 2019-01-02     -1
#> 4 2019-01-03     25

acct2 = data.frame(
  Date=as.Date(c("2019/1/2", "2019/1/3", "2019/1/3", "2019/1/3")), 
  Amount=c(7, 0, -7, 0)
  )
acct2 = acct2 %>% mutate(rownum=row_number())
#> Error in acct2 %>% mutate(rownum = row_number()): could not find function "%>%"
acct2
#>         Date Amount
#> 1 2019-01-02      7
#> 2 2019-01-03      0
#> 3 2019-01-03     -7
#> 4 2019-01-03      0

dplyr::full_join(acct1, acct2, by=c("rownum", "Date"), suffix=c(".ACCT1", ".ACCT2")) %>% 
  select(-rownum) %>% 
  arrange(Date)
#>         Date Amount.ACCT1 Amount.ACCT2
#> 1 2019-01-01           10           NA
#> 2 2019-01-02          -20           NA
#> 3 2019-01-02           -1           NA
#> 4 2019-01-02           NA            7
#> 5 2019-01-03           25            0
#> 6 2019-01-03           NA            0
#> 7 2019-01-03           NA           -7

Создано в 2019-06-17 пакетом Представление (v0.3.0)

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Адаптируясь из моего более раннего не-SO ответа , указанного в OP:

full_join(acct1 %>% group_by(Date) %>% mutate(id = row_number()),
          acct2 %>% group_by(Date) %>% mutate(id = row_number()),
          by = c("id", "Date")) %>% 
  arrange(Date) %>%
  ungroup() %>%
  select(Date, id, acct1 = Amount.x, acct2 = Amount.y)

# A tibble: 6 x 4
  Date          id acct1 acct2
  <date>     <int> <dbl> <dbl>
1 2019-01-01     1    10    NA
2 2019-01-02     1   -20     7
3 2019-01-02     2    -1    NA
4 2019-01-03     1    25     0
5 2019-01-03     2    NA    -7
6 2019-01-03     3    NA     0
0 голосов
/ 17 июня 2019

Поскольку в день может быть более 1 транзакции, список более естественный, чем вектор.Пример:

acct1 <- acct1 %>% group_by(Date) %>% summarize(Amount = list(Amount))
acct2 <- acct2 %>% group_by(Date) %>% summarize(Amount = list(Amount))

dplyr::full_join(acct1, acct2, by="Date", suffix=c(".ACCT1", ".ACCT2")) %>% as.data.frame

        Date Amount.ACCT1 Amount.ACCT2
1 2019-01-01           10         NULL
2 2019-01-02      -20, -1            7
3 2019-01-03           25     0, -7, 0

Используя этот подход, вы не получите дублированные транзакции.

...