R基于来自一列的值汇总列中的唯一值

时间:2015-05-05 18:48:45

标签: r unique aggregate

我想根据var_1的值知道每列的唯一值总数。

例如:

Test <- data.frame(var_1 = c("a","a","a", "b", "b", "c", "c", "c", "c", "c"), var_2 = c("bl","bf","bl", "bl","bf","bl","bl","bf","bc", "bg" ), var_3 = c("cf","cf","eg", "cf","cf","eg","cf","dr","eg","fg"))

我正在寻找的结果将基于var_1中的值,应该是:

var_1 var_2 var_3
a     2     2
b     2     1
c     3     4

然而,在尝试了各种方法(包括apply和table)之后 - 聚合是我最接近的东西,但是这个脚本会得到var_1的每个值的总条目数的摘要,但是总数不是唯一的

agbyv1= aggregate(. ~ var_1, Test, length) 

var_1 var_2 var_3
a     3     3
b     2     2
c     5     5

我试过

unqbyv1= aggregate(. ~ var_1, Test, length(unique(x)))

但这没有用。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:5)

尝试

library(dplyr)
Test %>%
      group_by(var_1) %>% 
      summarise_each(funs(n_distinct(.)))

或者

library(data.table)#v1.9.5+
setDT(Test)[, lapply(.SD, uniqueN), var_1]

如果有NAs

setDT(Test)[, lapply(.SD, function(x) uniqueN(na.omit(x))), var_1]

或者您可以使用aggregate。默认情况下为na.action=na.omit。所以,我们不需要任何修改。

aggregate(.~ var_1, Test, FUN=function(x) length(unique(x)) )

答案 1 :(得分:0)

试试这个:

apply(Test[-1] , 2 , function(y) tapply(y,Test$var_1,function(x) length(unique(x))))