Construct list from a dataframe and a formula
Code Quality
Blank Lines
Generally, your code quality needs some improvement. For example, insert blank lines. So instead of
factors &lt;- rownames(attr(tf, &quot;factors&quot;))
tvars &lt;- attr(tf, &quot;variables&quot;)
tlabs &lt;- attr(tf, &quot;term.labels&quot;)

I would suggest
factors &lt;- rownames(attr(tf, &quot;factors&quot;))

tvars &lt;- attr(tf, &quot;variables&quot;)

tlabs &lt;- attr(tf, &quot;term.labels&quot;)

Order Within A Script or Source Code
Generally, one puts package import statements at the top of a file. Which you are not doing, and you also give no reason why you are doing it. So I would put library(lazyeval) at the top.
Further, you set variables before you use them. For example, factors &lt;- rownames(attr(tf, &quot;factors&quot;)).
These observations lead to the following script.
# to use 'as.lazy' and 'lazy_eval'
library(lazyeval)


dat &lt;- data.frame(
  A = c(&quot;a&quot;, &quot;b&quot;, &quot;c&quot;),
  B = c(&quot;x&quot;, &quot;y&quot;, &quot;z&quot;),
  NotUsed = c(1, 2, 3))


frml &lt;- ~ A + B + A:B
tf &lt;- terms.formula(frml)


tvars &lt;- attr(tf, &quot;variables&quot;)
used &lt;- lapply(eval(tvars, envir = dat), as.factor)
names(used) &lt;- rownames(attr(tf, &quot;factors&quot;))


tlabs &lt;- attr(tf, &quot;term.labels&quot;)

lapply(tlabs, function(tlab){
  droplevels(lazy_eval(as.lazy(tlab), data = used))
})

Please pay attention to how a grouped the code lines.
A Better Way
Regarding a better way, for which you have asked, I would propose the following.
dat &lt;- data.frame(A = c(&quot;a&quot;, &quot;b&quot;, &quot;c&quot;),
                  B = c(&quot;x&quot;, &quot;y&quot;, &quot;z&quot;),
                  NotUsed = c(1, 2, 3))

dat &lt;- subset(x = dat, select = -NotUsed)

dat$c &lt;- as.factor(paste(dat$A, dat$B, sep = &quot;:&quot;))

my.list &lt;- lapply(dat,
                  FUN = function(column)
                  {
                      return(column)
                  })

In my view, this is a better way because it expresses your intention better. If you would have given me your code without any comments I would have a hard time explaining what it does or what it's purpose is. In addition, it does not require an additional package.
HTH!