如何计算r中矩阵行中三元组的数量?

时间:2016-05-11 02:19:01

标签: r matrix

我有这个矩阵:

m
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    1    3    1    6    8    8    8
[2,]    2    2    5    7    9    7    4
[3,]    1    2    3    4    5    6    7
[4,]    1    2    3    4    5    6    7

我想计算每列中的三元组数。

所以我希望得到一个矢量,例如:[1,0,0,0],因为只有第一行包含三个相邻的相同矩阵。

R中是否有任何功能可以完成此任务,而且不涉及编写长函数?

好吧,我冒着风险,但是,反映这些评论,也因为将问题分成两部分(有争议)没有多大意义,让我问一下我真正追求的是什么:检测{{1}在矩阵的每一行中的三元组(或其不存在),例如:

4

2 个答案:

答案 0 :(得分:4)

我们可以使用data.table

library(data.table)
apply(m, 1, function(x) any(tabulate(rleid(x))==3))
#[1] TRUE FALSE FALSE FALSE

如果我们需要查找连续是否有4个三元组(基于新数据集)

apply(m1, 1, function(x) sum(tabulate(rleid(x))==3))==4
#[1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE

数据

library(psych)
m <- `dimnames<-`(as.matrix(read.clipboard()), NULL)
m1 <- `dimnames<-`(as.matrix(read.clipboard()), NULL)

注意:在复制OP帖子中显示的每个数据输出并使用read.clipboard中的psych后,读取数据集。

答案 1 :(得分:2)

一种解决方案是使用dplyr包中的滞后运算符,如下所示:

apply(m, 1, function(x) any((x == lag(x)) & (x == lag(x, 2))))

更一般的数字序列可能计算如下:

apply(m, 1, function(x) all(diff(which(diff(x) == 0)) == 1) & (length(which(diff(x) == 0)) == 2))

最后2的位置是(n-1),其中n = 3。你也可以通过不计算which(diff(x....)部分两次来优化它。

您的示例输出为:

[1]  TRUE FALSE FALSE FALSE

似乎在名为rle的基础中存在此函数,它计算向量中每个值的运行长度。您可以按如下方式使用它:

apply(m, 1, function(x) any(rle(x)$lengths == 3))

给你相同的输出:

[1]  TRUE FALSE FALSE FALSE