Пример данных:
Bilagstoptekst <- c("A", "A", "A", "A", "A","B","B","C","C","C","C","C","C","C")
AKT <- c("80","80","80","25","25","25","25","80","80","80","80","80","80","80")
IA <- c("HUVE", "HUVE", "HUBO", "BILÅ", "BILÅ", "BILÅ","BILÅ", "HUBO","HUBO","HUBO","HUBO","HUBO","HUBO","HUBO")
Belob <- c(100,100,50,75,40,60,400,100,100,100,100,100,333,333)
FPT8 <- data.frame(Bilagstoptekst, AKT, IA, Belob)
> FPT8
Bilagstoptekst AKT IA Belob
A 80 HUVE 100
A 80 HUVE 100
A 80 HUBO 50
A 25 BILÅ 75
A 25 BILÅ 40
B 25 BILÅ 60
B 25 BILÅ 400
C 80 HUBO 100
C 80 HUBO 100
C 80 HUBO 100
C 80 HUBO 100
C 80 HUBO 100
C 80 HUBO 333
C 80 HUBO 333
Bilagstoptekst <- c("A", "A", "A", "A", "B", "C", "C")
AKT <- c("80", "80", "25", "25", "25", "80", "80")
IA <- c("HUVE", "HUBO", "BILÅ", "BILÅ", "BILÅ", "HUBO", "HUBO")
RegKonto <- c(4,5,7,1,6,3,9)
Psteksnr <- c(1,6,8,2,5,7,9)
Belob_sum <- c(200,50,75,40,460,500,666)
G69 <- data.frame(Bilagstoptekst, AKT, IA, RegKonto, Psteksnr, Belob_sum)
> G69
Bilagstoptekst AKT IA RegKonto Psteksnr Belob_sum
A 80 HUVE 4 1 200
A 80 HUBO 5 6 50
A 25 BILÅ 7 8 75
A 25 BILÅ 1 2 40
B 25 BILÅ 6 5 460
C 80 HUBO 3 7 500
C 80 HUBO 9 9 666
Теперь мой реальный набор данных очень большой.
Что я хочу сделать, это объединить RegKonto и Psteksnr из G69 в FPT8 .
У меня есть три ключевых столбца, которые должны совпадать друг с другом в двух фреймах данных:
Билагстоптекст, АКТ, ИА .
Но я не могу просто пойти налево, используя их, так как есть другое правило. FPT8 $ Белоб должен соответствовать G69 $ Белоб_сум . И иногда это совпадает (fx в моем примере строки данных 3). Иногда я могу найти совпадение, сложив все FPT8 $ Belob вместе и сопоставив это число (в сочетании с моими 3 ключевыми столбцами) с G69 $ Belob_sum (fx в строке 1 и 2 ).
Но иногда бывает случайным, какие строки складывать, чтобы найти правильное совпадение (ну, на самом деле это не случайно, но, похоже, так!) Как и последние строки с bilagstoptekst == C.
Я спрашиваю, есть ли способ складывать разные комбинации и использовать их для слияния.
Ожидаемый результат:
> FPT8
Bilagstoptekst AKT IA Belob RegKonto Psteksnr
A 80 HUVE 100 4 1
A 80 HUVE 100 4 1
A 80 HUBO 50 5 6
A 25 BILÅ 75 7 8
A 25 BILÅ 40 1 2
B 25 BILÅ 60 6 5
B 25 BILÅ 400 6 5
C 80 HUBO 100 3 7
C 80 HUBO 100 3 7
C 80 HUBO 100 3 7
C 80 HUBO 100 3 7
C 80 HUBO 100 3 7
C 80 HUBO 333 9 9
C 80 HUBO 333 9 9
Что я уже пробовал:
Я распространил - для каждой строки ключей - какие существуют разные значения FPT8 $ Белоба.
dt <- as.data.table(FPT8)
dt[, idx := rowid(Bilagstoptekst, AKT, IA)] # creates the timevar
out <- dcast(dt,
Bilagstoptekst + AKT + IA~ paste0("Belob", idx),
value.var = "Belob")
А потом я сделал разные комбинации сумм Белоба FPT8 $, которые я разложил:
# Adding together two different FPT8$Belob - all combinations
output <- as.data.frame(combn(ncol(out[,-c(1:3)]), m=2, FUN =function(x) rowSums(out[,-c(1:3)][x])))
names(output) <- paste0("sum_", combn(names(out[,-c(1:3)]), 2, FUN = paste, collapse="_"))
После этого я сливался туда и обратно, и я действительно не хочу входить в эту часть, потому что это был беспорядок, когда у меня было более 4 разных FPT8 $ Белоба на ключ (3 столбца). Поэтому мне определенно нужен более плавный способ сделать это.
Надеюсь, кто-нибудь сможет мне помочь.
РЕДАКТИРОВАТЬ: Как строки объединяются и немного больше объяснений
Так что мои данные FPT8 - это куча платежей (Белоб означает сумму денег). Данные G69 - это счета. Мне нужно найти правильное соответствие, но моя проблема в том, что иногда люди предпочитают разделить свой счет на более мелкие платежи. Поэтому данные FPT8 больше, чем данные G69.
Позвольте мне объяснить ..
У меня есть 4 ключевых столбца: Билагстоптекст, АКТ, ИА и Белоб. Сначала 3 должны всегда найти точное совпадение в данных FPT8. Иногда Belob совпадает с Belob_sum в G69 (строка за строкой), иногда нам нужна комбинация сумм строк FPT8 Belob в одной и той же в Bilagstoptekst, AKT и IA , чтобы соответствовать Belob_sum в G69. Позвольте мне попытаться показать это с моими примерами данных ниже.
FPT8:
Исходя из моих трех ключевых столбцов ** Bilagstoptekst *, AKT и IA , первые две строки "одинаковы" (то есть один и тот же счет был оплачен более двух раз). Я добавил столбец идентификаторов в качестве первого столбца, которого нет в моих реальных данных. Это только для объяснения. Поэтому эти две строки я называю ID = 1.
Строка № 3 (ID = 2) не совпадает с другими строками в моих выборочных данных FPT8, поскольку не существует других с комбинацией ключевых столбцов (т. Е. Человек заплатил весь счет за один раз - это легко сопоставить с информацией о счете G69).
В нижней части все Bilagstoptekst == C имеют одинаковую комбинацию из трех ключевых столбцов (C, 80 и HUBO). Это тот же счет. Но это не тот же счет. В этом случае я могу найти два совпадения в данных G69. Как мне узнать, какой из них правильный? Я смотрю на столбцы FPT8 $ Belob и G69 $ Belob_sum.
G69:
Так что, если бы я делал это вручную, я бы попытался найти разные комбинации сумм в FPT8 $ Belob, которые совпадают с G69 $ Belob_sum вместе с другими 3 ключевыми столбцами. Fx Я вижу, что две последние строки складываются до 666 в Belob, что соответствует последней строке в G69. Другой Bilagstoptekst == C, AKT = 80 и IA = HUBO соответствует второй последней строке в G69, так как 100 * 5 = 500.
Желаемый вывод:
Я добавил несколько цветов, поэтому надеюсь, что теперь это легче понять.