在具有不同参数的每一行上应用函数

时间:2015-09-02 10:42:13

标签: r data.table apply

我有数据表,如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"将需要为每一行采用不同的列。

任何帮助将不胜感激。

1 个答案:

答案 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