Optimizing a Solution to an Overdetermined System
Here is how you can completely vectorize your code, making use of matrix functions such as crossprod, colSums, and %*%. Without for loops, your code will be more concise and faster to execute. 

The construction of allCards was indeed a problem. Incrementally growing an object like you did is very memory intensive: each time you add a row, a new object is built from scratch. On the other hand, your comment that I've read that making a matrix of the correct size and filling it with NA only to fill in its values later is very memory-intensive is not accurate. Here the object is created once and filled in-place by the for loops.

To summarize: growing an object iteratively is the worst. Initializing an object to its final size and filling it in place via for loops is preferable. Using a vectorized function to create the object in one shot is the best. Hope it helps!

numberOfCards &lt;- 9
numberOfEffects &lt;- 3

allCards &lt;- rbind(
  c(1,2,1,1), # Murloc Raider
  c(2,2,3,1), # River Crocolisk
  c(2,3,2,1), # Bloodfen Raptor
  c(3,5,1,1), # Magma Rager
  c(4,2,7,1), # Oasis Snapjaw
  c(4,4,5,1), # Chillwind Yeti
  c(6,6,7,1), # Boulderfist Ogre
  c(7,7,7,1), # War Golem
  c(7,9,5,1)  # Core Hound
)

cardMana        &lt;- allCards[, 1]
cardValueMatrix &lt;- allCards[, -1]
coefficientsMatrix &lt;- crossprod(cardValueMatrix)
constantsVector &lt;- colSums(cardMana * cardValueMatrix)
effectValues &lt;- solve(coefficientsMatrix, constantsVector, tol = 1e-9)
cat(effectValues, "\n\n")
cardValues &lt;- cardValueMatrix %*% effectValues
cat(sprintf("Card %i: %.3f", seq(numberOfCards), cardValues), sep = "\n")