如何有效地计算每列R中的数字唯一值

时间:2015-09-16 14:31:40

标签: r unique

我的目标是查找数据框中每列有多少唯一值,这是我想出的

### df is a data frame, 32 named columns, millions of rows 

test1 <- sapply(df, function(x) length(unique(x)))

### I get a named integer from the above command 

test2 <- data.frame(names(test1), test1)

### now I get a data frame, with row names

row.names(test2) <- NULL

### to get rid of the row names 

test3 <- test2[order(test1),]

### finally I get a what I want     

我的问题是,如何以较少的步骤进行此操作???

3 个答案:

答案 0 :(得分:4)

基地R中的一次电话:

a,b,c,d
f,g,h,j
a,b
f,y,u

输出:

#using the same column names as in your example
test1 <- data.frame(names.test1 = colnames(mtcars), 
                    test1=sapply(mtcars, function(x) length(unique(x))),
                    row.names=NULL)

这需要手动订购,但@BenBolker在评论中提及:

> test1
   names.test1 test1
1          mpg    25
2          cyl     3
3         disp    27
4           hp    22
5         drat    22
6           wt    29
7         qsec    30
8           vs     2
9           am     2
10        gear     3
11        carb     6

但是,您可以使用test1 <- test1[order(test1$test1),]) 执行有序的单行注册:

data.table

答案 1 :(得分:3)

我不确定这是不是你想要的。 请提供您的数据集示例(使用dput

想象一下,您想要计算数据mtcars的唯一值的数量。

library(tidyr)
library(dplyr)

mtcars %>% 
  gather() %>% 
  group_by(key) %>% 
  summarise( ndist = n_distinct(value) ) %>% 
  arrange(desc(ndist))  

这会给你

    key ndist
1  qsec    30
2    wt    29
3  disp    27
4   mpg    25
5    hp    22
6  drat    22
7  carb     6
8   cyl     3
9  gear     3
10   vs     2
11   am     2

答案 2 :(得分:1)

这是你的意思吗?

    test1 <- sort(sapply(df, function(x) length(unique(x))), decreasing = T)
    data.frame(names(test1), test1, row.names = NULL)