Adjacent faces in a discrete mesh
With Szabolcs' IGraphM package that's super easy and fast (1000 times faster for your given example):
Needs["IGraphM`"]
R = DiscretizeRegion[Sphere[]];
pairs = UpperTriangularize[IGMeshCellAdjacencyMatrix[R, 2, 2]]["NonzeroPositions"];
facepairs = Partition[
MeshCells[R, 2, "Multicells" -> True][[1, 1]][[Flatten[pairs]]],
2
];
For the development history of this code see How to obtain the cell-adjacency graph of a mesh? Also notice that the code the code in my answer 160457 there is a bit more up to date and hence a bit faster.
NDSolve`FEM - "BoundaryConnectivity"
If you allow connections through a vertex to define neighbors, you can use NDSolve`FEM
:
Needs["NDSolve`FEM`"]
bmesh = ToBoundaryMesh[R];
connectivity = bmesh["BoundaryConnectivity"];
HighlightMesh[R, {Style[MeshCells[R, {2, 1}], Red],
MeshCells[R, #] & /@ Thread[{2, connectivity[[1]]}]}]
We can modify connectivity
to keep only elements adjacent through an edge:
connectivity2 = MapIndexed[Function[{x, ind},
DeleteCases[x, 0|_?(Length[Intersection[faces[[ind[[1]]]], faces[[#]]]] != 2&)]],
connectivity];
HighlightMesh[R, {Style[MeshCells[R, {2, 1}], Red],
Style[MeshCells[R, {2, 10}], Green],
MeshCells[R, {2, #}] & /@ connectivity2[[1]],
MeshCells[R, {2, #}] & /@ connectivity2[[10]]}]