Regarding check.names, note that transform isn't alone in this misbehaviour. If you refer to the last few points of section 4.5.6 (titled 'Silence') in my article linked below, you'll see that subset appears to do the same. My guess is that all of the functions like with, transform, within, and subset will likely share these properties. For a quick example, compare the 'foo' columns of cbind(mtcars, foo = 3, foo = 4, foo = 5) to that of subset(cbind(mtcars, foo = 3, foo = 4, foo = 5), select = -carb). It looks like check.names has modified the column names in the subset case only. Link: https://github.com/ReeceGoding/Frustration-One-Year-With-R#456-silence Note: This is my first ever post here. Let me know if I've done something silly.