Для данных вашего примера, в которых предполагается, что A и B имеют одинаковые строки и в одинаковом порядке, следующий код дает желаемый результат:
t(t(as.matrix(A[,-1])) %*% as.matrix(B[,-1]))
abduction abortion academic access
AFG 0 0 0 5
AGO 0 4 4 0
ALB 0 3 3 1
AND 5 1 3 4
При этом используется умножение матриц.
Для ваших реальных наборов данных (темы 1К и 190 стран) вам нужно будет убедиться, что обе они содержат одинаковое количество строк, и что они находятся в одинаковом порядке на основе столбца общего индекса. Если нет, то вам нужно сохранить только те записи, которые имеют одинаковые, а затем отсортировать их по этому общему столбцу индекса. Это тривиально.
Данные
> A
id abduction abortion academic access
1 A 1 0 0 0
2 B 0 1 1 0
3 C 0 0 1 0
4 D 0 0 0 1
> B
id AFG AGO ALB AND
1 A 0 0 0 5
2 B 0 4 3 1
3 C 0 0 0 2
4 D 5 0 1 4
A <- structure(list(id = structure(1:4, .Label = c("A", "B", "C",
"D"), class = "factor"), abduction = c(1, 0, 0, 0), abortion = c(0,
1, 0, 0), academic = c(0, 1, 1, 0), access = c(0, 0, 0, 1)), row.names = c(NA,
-4L), class = "data.frame")
B <- structure(list(id = structure(1:4, .Label = c("A", "B", "C",
"D"), class = "factor"), AFG = c(0, 0, 0, 5), AGO = c(0, 4, 0,
0), ALB = c(0, 3, 0, 1), AND = c(5, 1, 2, 4)), row.names = c(NA,
-4L), class = "data.frame")