You can get unique levels for the first two columns:
de<- apply(df[,1:2],2,unique) de # $Site.1 # [1] "A" "B" "C" # $Site.2 # [1] "D" "B"
Then you can take the symmetric difference of the two sets:
union(setdiff(de$Site.1,de$Site.2), setdiff(de$Site.2,de$Site.1))
If you are only interested in the first two two lines (as in your example):
de<- apply(df[1:2,1:2],2,unique) de # Site.1 Site.2 # [1,] "A" "D" # [2,] "B" "B" union(de[,1],de[,2]) # [1] "A" "B" "D"
sztup source share