Creating a count table using R
You could give a try with dplyr's full_join() and purrr's reduce(). full_join() will make sure that you won't lose any data and reduce() will merge tables in your list from left to right, left being the first table of the list in the first iteration but would become merged table1+table2 in the second iteration and so on. This left to right "reduction" will also be helpful when renaming the columns of the resulting table.

Without your workspace I have attempted to replicate your data: There is a list of 3 data frames, each with 2 columns:

library(dplyr)
library(purrr)

df1 &lt;- data.frame(CDR3.aa = c("A", "B", "C"),
                  Count = c(10,20,100))

df2 &lt;- data.frame(CDR3.aa = c("A", "B", "D"),
                  Count = c(100,200,300))

df3 &lt;- data.frame(CDR3.aa = c("D", "E", "F"),
                  Count = c(10,20,100))

my_list &lt;- list(df1 = df1, df2 = df2, df3 = df3)

&gt; my_list
$df1
  CDR3.aa Count
1       A    10
2       B    20
3       C   100

$df2
  CDR3.aa Count
1       A   100
2       B   200
3       D   300

$df3
  CDR3.aa Count
1       D    10
2       E    20
3       F   100

# "by" argument specifies which column to use when merging
my_table &lt;- reduce(my_list, full_join, by = "CDR3.aa")

names(my_table) &lt;- c("CDR3.aa", names(my_list))

&gt; my_table
  CDR3.aa df1 df2 df3
1       A  10 100  NA
2       B  20 200  NA
3       C 100  NA  NA
4       D  NA 300  10
5       E  NA  NA  20
6       F  NA  NA 100


Clonotypes that are not present in table will be "NA".