我有数据表,如DT,
col1 col2 col3 col4 col5
1: 1 2 3 4 5
2: 4 5 6 8 9
3: 3 4 4 5 5
4: 4 3 5 3 3
5: 4 5 6 6 67
我想计算每行的某些列中的唯一值(对于每行我想使用不同的列来计算唯一的行)
如何以最少的步骤实现这一目标?该表非常庞大,因此无法运行循环。
我正在寻找像
这样的解决方案 DT[ , count_unique:= apply(DT[ , cols, with = F], 1, function(x) { length(unique(x)) })]
但这会失败,因为" cols"将需要为每一行采用不同的列。
任何帮助将不胜感激。
答案 0 :(得分:0)
我认为这对于具有矩阵子集操作的矩阵来说是最容易的(偶然地,data.table
连接语法从中受到启发)。
假设这是您的数据:
m = matrix(c(1:4, 1,3,2,2, 1,2,3,3), ncol = 3)
# [,1] [,2] [,3]
#[1,] 1 1 1
#[2,] 2 3 2
#[3,] 3 2 3
#[4,] 4 2 3
假设您要计算第1行和第2行的所有列的唯一值,以及第3行和第4行的第一列和最后一列的唯一值。您可以表示如下:
cols = matrix(c(1,1, 1,2, 1,3,
2,1, 2,2, 2,3,
3,1, 3,3,
4,1, 4,3), ncol = 2, byrow = T)
# [,1] [,2]
# [1,] 1 1
# [2,] 1 2
# [3,] 1 3
# [4,] 2 1
# [5,] 2 2
# [6,] 2 3
# [7,] 3 1
# [8,] 3 3
# [9,] 4 1
#[10,] 4 3
您想要的结果很容易计算:
tapply(m[cols], cols[,1], function(x) length(unique(x)))
#1 2 3 4
#1 2 1 2