首页 文章

即使值的数量不同,如何将dataframe列中的唯一值转换为数据帧

提问于
浏览
2

我有一个数据帧数据:

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

我试图从每个列中提取唯一值到data.frame . 每列具有不同的唯一值集和数量 .

我正在寻找类似的东西:

A  1   2   3   4   5   6   7 
B  5   6   NA  NA  NA  NA  NA
C  1   2   3   4   5   NA  NA

我能够遍历它并得到一个包含信息的列表(我尝试使用列表,因为它们的长度不同)

vars <- c('A','B','C')
mylist = vector("list",length(vars))
for(i in 1: length(vars)){
   mylist[[i]] <- c( names(table( Data[ , vars[i] ] )))
}

如何将信息导入data.frame,理想情况下没有循环?谢谢!

2 回答

  • 2

    lapply() 就足够了 . 这是我使用的技巧 .

    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
    

    首先,我们遍历 Data 的列以查找所有唯一值 . 然后我们迭代它,使用 length<- 将每个元素的长度扩展到 xx 的最长元素的长度 . 然后我们将它们整合到一个数据框中 .

  • 2

    这是一个可能的 data.table 解决方案

    library(data.table)
    data.frame(t(setDT(Data)[, lapply(.SD, function(x) {
                                      temp <- unique(x)
                                      c(sort(temp), 
                                      rep(NA, length(x) - length(temp)))
                                      })]))
    
    #   X1 X2 X3 X4 X5 X6 X7
    # A  1  2  3  4  5  6  7
    # B  5  6 NA NA NA NA NA
    # C  1  2  3  4  5 NA NA
    

相关问题