【问题标题】:Unique values in each of the columns of a data frame数据框每一列中的唯一值
【发布时间】:2013-11-04 05:01:47
【问题描述】:

我想获取数据框每一列中唯一值的数量。 假设我有以下数据框:

DF <- data.frame(v1 = c(1,2,3,2), v2 = c("a","a","b","b"))

那么它应该返回 v1 有 3 个不同的值,v2 有 2 个。

我尝试了 unique(DF),但它不起作用,因为每一行都不一样。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    或者使用unique:

    rapply(DF,function(x)length(unique(x)))
    v1 v2 
     3  2 
    

    【讨论】:

      【解决方案2】:
      sapply(DF, function(x) length(unique(x)))
      

      【讨论】:

        【解决方案3】:

        dplyr:

        DF %>% summarise_all(funs(n_distinct(.)))
        

        【讨论】:

          【解决方案4】:

          这是一种方法:

          > lapply(DF, function(x) length(table(x)))
          $v1
          [1] 3
          
          $v2
          [1] 2
          

          这基本上列出了每列的唯一值。在上面使用length 会告诉您号码。删除 length 将显示唯一值的实际表。

          【讨论】:

            【解决方案5】:

            dplyr (&gt;=1.0.0 - june 2020):

            DF %>% summarize_all(n_distinct)
            
              v1 v2
            1  3  2
            

            【讨论】:

              【解决方案6】:

              为了完整起见:自 2015 年 9 月 19 日的 CRAN 版本 1.9.6 起,data.table 包包含帮助函数 uniqueN(),这使我们免于编写

              function(x) length(unique(x))

              当调用apply() 的兄弟之一时:

              sapply(DF, data.table::uniqueN)
              
              v1 v2 
               3  2
              

              请注意,data.table 包既不需要加载,也不需要将DF 强制转换为data.table 类,以便在此处使用uniqueN()

              【讨论】:

                【解决方案7】:

                这应该适用于为每个变量获取唯一值:

                length(unique(datasetname$variablename))
                

                【讨论】:

                  【解决方案8】:

                  我认为这样的功能会给你你正在寻找的东西。除了每个数据框的列中有多少 NA 之外,这还显示了唯一值。只需插入您的数据框,您就可以开始了。

                  totaluniquevals <- function(df) {
                    x <<- data.frame("Row Name"= numeric(0), "TotalUnique"=numeric(0), "IsNA"=numeric(0))
                    result <- sapply(df, function(x) length(unique(x)))
                    isnatotals <- sapply(df, function(x) sum(is.na(x)))
                  
                    #Now Create the Row names
                    for (i in 1:length(colnames(df))) {
                      x[i,1] <<- (names(result[i]))
                      x[i,2] <<- result[[i]]
                      x[i,3] <<- isnatotals[[i]]
                  
                    }
                    return(x)
                  }
                  

                  测试:

                  DF <- data.frame(v1 = c(1,2,3,2), v2 = c("a","a","b","b"))
                  totaluniquevals(DF)
                    Row.Name TotalUnique IsNA
                  1       v1           3    0
                  2       v2           2    0
                  

                  然后您可以在任何列上使用 unique 来查看具体的唯一值是什么。

                  独特(DF$v2) [1] 一个 级别:a b

                  【讨论】:

                  • 为什么要在函数中对临时变量使用全局赋值&lt;&lt;-?这将覆盖函数外部定义的任何对象x
                  • 顺便说一句,您的函数可以更简洁地重写为totaluniquevals &lt;- function(df) data.frame(Row.Name = names(df), TotalUnique = sapply(df, function(x) length(unique(x))), IsNA = sapply(df, function(x) sum(is.na(x))))
                  【解决方案9】:

                  这将在第 1 列的 DF 数据框中为您提供唯一值。

                  unique(sc_data[,1])
                  

                  【讨论】:

                  • OP 已询问:我想获取数据框每一列中唯一值的数量。您的答案仅返回一列的唯一值,甚至没有数字。所以,它没有回答这个问题。请考虑删除您的帖子。
                  猜你喜欢
                  • 2016-12-22
                  • 1970-01-01
                  • 2015-01-30
                  • 2018-07-26
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多