And also, I forgot R can handle nested capture groups, so you can actually replace the regex from my solution with the much shorter sub("(.*([A-Z]+[a-z]+) ([a-z]+))", "\\2_\\3_\\1", string). Note I've also fixed the regex to account for the fact that OP wants an underscore within the species name.
There's probably an even more concise solution with a single capture group, but I can't really think of it now. (Not that this matters for the OP probably.)
I assumed you had your file imported into R already, as a data.frame or something to that effect.
So if it's just a FASTA file you need to manipulate in general, and you're not bound to R, here's a solution assuming you're working in a Unix-like environment (e.g., Ubuntu, off of which I am basing the rest of the explanation here).
I'm assuming you have all your sequences in a file named input.fasta, which looks something like this:
Note: output.fasta will be stored wherever you're running sed from within the file system tree . To check where you are (from the command line) type in pwd, and it should indicate your current location as a path. Ideally what you want to do -- if you're inexperienced with this -- is to use your GUI file browser to navigate to the directory/folder where input.fasta is located, and launch the command line terminal from there (right click -> "Open in Terminal" in Ubuntu, for example). This way, output.fasta will be located exactly where input.fasta is.
if sequences are in single line and headers are in exactly in same format:
with sed: