2014-09-24 33 views
1

我有一个大型数据集,其中包含5个时间段的重复测量。在R中的变量(列)中计数唯一值

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)并尝试了它提供的各种解决方案。然而,它给我的是每个值的计数,而不是唯一值的数量。 这里的其他类似问题似乎要求关于计算变量/列中唯一值的数量,而不是跨每行。 任何建议,将不胜感激。

回答

0

诀窍是使用“应用”和每行赋值给一个变量(例如,x)。然后你可以编写一个自定义函数,在这种情况下,使用'unique'和'length'来获得你想要的答案。

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))}) 
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 
+0

谢谢,这工作完美! – user3251223 2014-09-25 16:20:56

+0

请注意:如果您的数据框中包含NAs,则会将这些值视为唯一值。用以下命令修改:df $ nunique < - apply(df,1,function(x)length(unique(na.omit(x)))) - 我添加了一个应用于'x'的'na.omit'。 – 2016-03-17 15:41:30

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) 
+0

试过用matrixStats软件包 - 确实快得多 - 谢谢! – user3251223 2014-09-26 17:02:12

+0

S4Vectors比它快大约4倍。 – 2014-09-26 18:50:39