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]]}]}]

enter image description here

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]]}]

enter image description here