У меня есть два фрейма данных:
dfA
содержит 10 наблюдений в строке.dfB
имеет соответствующую цену на все отдельные наблюдения.
Моя задача состоит в том, чтобы просмотреть любые 2 строки в dfA
, выяснить, какие элементы находятся в обеих строках, просуммировать цену совпадающих элементов и сохранить результаты в новом фрейме данных, dfC
.
Например, скажем, у нас есть в dfA
:
row 1: A, B, C, X, X, X, X, X, X, X
row 2: Z, Z, A, Z, C, Z, Z, B, Z, Z
и в dfB
:
A, 63
B, 22
C, 99
...
Перекрытие в строках 1 и 2 — это A, B и C, поэтому я бы хотел (63 + 22 + 99) / 1000
в dfC[1, 2]
и dfC[2, 1]
.
Следующий код делает то, что мне нужно, но он неэффективен, так как n становится большим. Мой фактический dfA
имеет более 1000 строк, и его выполнение может занять около 10 минут, поэтому я ищу способы написать это более эффективно.
set.seed(42)
n <- 10
dfA <- data.frame(replicate(10 ,sample(LETTERS,n,rep=TRUE)), stringsAsFactors = F)
dfB <- data.frame(ID = LETTERS, Price = as.numeric(sample(1:100, 26, replace=FALSE)), stringsAsFactors = F)
overlapPrice <- function (A, B) {
if (A == B) {
return(1)
} else {
x <- intersect(t(dfA[A, ]), t(dfA[B, ]))
return(sum(dfB$Price[match(x, dfB$ID)])/1000)
}
}
dfC <- data.frame(matrix(vector(), n, n))
for (i in (1:n)) {
for (j in (i:n)) {
dfC[i, j] <- overlapPrice(i, j)
dfC[j, i] <- dfC[i, j]
}
}