计算R中变量(列)的唯一值

时间:2014-09-24 20:50:38

标签: r unique-values

我有一个大型数据集,在5个时间段内重复测量。

   2012  2009  2006  2003  2000
    3     1     4     4     1
    5     3     2     2     3
    6     7     3     5     6 

我想添加一个新列,这是2000年到2012年间唯一值的数量。例如,

   2012  2009  2006  2003  2000  nunique
    3     1     4     4     1      3
    5     3     2     2     3      3
    6     7     3     5     6      4

我在R工作,如果有帮助,每个时间段的测量值只有14个不同的值。

我找到了这个页面:Count occurrences of value in a set of variables in R (per row)并尝试了提供的各种解决方案。然而,它给我的是每个值的计数,而不是唯一值的数量。 此处的其他类似问题似乎询问有关计算变量/列中唯一值的数量,而不是每行的数量。 任何建议,将不胜感激。

4 个答案:

答案 0 :(得分:2)

这是另一种选择

> df$nunique <- apply(df, 1, function(x) length(unique(x)))
> df
  2012 2009 2006 2003 2000 nunique
1    3    1    4    4    1       3
2    5    3    2    2    3       3
3    6    7    3    5    6       4

答案 1 :(得分:1)

如果您有一个大型数据集,您可能希望避免循环遍历行,但使用更快的框架,如S4Vectors:

df <- data.frame('2012'=c(3,5,6),
             '2009'=c(1,3,7),
             '2006'=c(4,2,3),
             '2003'=c(4,2,5),
             '2000'=c(1,3,6))

dup <- S4Vectors:::duplicatedIntegerPairs(as.integer(as.matrix(df)), row(df))
dim(dup) <- dim(df)
rowSums(!dup)

或者,matrixStats包:

m <- as.matrix(df)
mode(m) <- "integer"
rowSums(matrixStats::rowTabulates(m) > 0)

答案 2 :(得分:0)

诀窍是使用&#39; apply&#39;并将每一行分配给变量(例如x)。然后,您可以编写一个自定义函数,在这种情况下,使用&#39; unique&#39;和&#39;长度&#39;得到你想要的答案。

df <- data.frame('2012'=c(3,5,6), '2009'=c(1,3,7), '2006'=c(4,2,3), '2003'=c(4,2,5), '2000'=c(1,3,6))

df$nunique = apply(df, 1, function(x) {length(unique(x))})

答案 3 :(得分:0)

试试这个:

sapply(data, function(x) length(unique(x)))