我有这个矩阵:
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
答案 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