我有一个大型数据集,在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)并尝试了提供的各种解决方案。然而,它给我的是每个值的计数,而不是唯一值的数量。 此处的其他类似问题似乎询问有关计算变量/列中唯一值的数量,而不是每行的数量。 任何建议,将不胜感激。
答案 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)))