I have a dataframe Data:
Data <- data.frame(A=sample(1:7),B=c(5,5,5,6,6,6,6),C=c(1,2,2,3,3,4,5))
A B C
1 6 5 1
2 7 5 2
3 4 5 2
4 2 6 3
5 1 6 3
6 5 6 4
7 3 6 5
I am trying to extract the unique values from each of the columns into a data.frame. Each column has a different set and number of unique values.
I am looking for something like:
A 1 2 3 4 5 6 7
B 5 6 NA NA NA NA NA
C 1 2 3 4 5 NA NA
I was able to loop through it and get a list with the information (I tried using a list because they are of different length)
vars <- c('A','B','C')
mylist = vector("list",length(vars))
for(i in 1: length(vars)){
mylist[[i]] <- c( names(table( Data[ , vars[i] ] )))
}
How can I get the information into a data.frame, ideally without a loop? Thanks!
lapply()
is sufficient for this. Here's the trick I use.
xx <- lapply(Data, unique)
data.frame(do.call(rbind, lapply(xx, "length<-", max(vapply(xx, length, 1L)))))
# X1 X2 X3 X4 X5 X6 X7
# A 2 3 6 5 1 7 4
# B 5 6 NA NA NA NA NA
# C 1 2 3 4 5 NA NA
First, we iterate over the columns of Data
to find all unique values. Then we iterate that, using length<-
to extend the length of each element to the length of xx
's longest element. Then we just bring it all together into a data frame.