我有一个像这样的大矩阵:
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 9 4 2 1 NA 7
[2,] 9 5 1 1 1 7
[3,] 3 5 1 5 NA 10
[4,] 9 4 2 14 NA 7
[5,] 18 4 4 24 NA 10
[6,] 24 5 4 30 NA 10
[7,] 6 3 1 31 1 10
[8,] 2 5 4 34 1 7
[9,] 4 5 2 34 NA 7
[10,] 4 5 2 34 NA 7
我计算在第6列中从7到10有多少变化。但我会成对计算。例如,它只允许每行计数一次(更准确地说,第4列中的数字必须只出现一次)。另外,我想知道第5行中的两个值是否等于1。
让我们用上面给出的矩阵做一个例子: 我在第2行到第3行中从第7列到第10列有一个更改。因此计数= 1.接下来我再次从第3行更改为4.但由于第3行无法计数两次,因此此更改不会计数(换句话说,在第5列中,值5将在我的计数中出现两次,这是不允许的。)
接下来,我计算从第4行到第5行的更改:count = count + 1.因此,count = 2直到现在。下一个更改将是从第7行到第8行。在第7行和第8行中,第5列中的值等于1.因此,我会得到结束:
count = 3
其中一对在第五列中有1个:
countl = 1
有人建议怎么做吗?
答案 0 :(得分:0)
做一个for循环。伪代码:
counter <- 0
evaluate <- 1 # 1 means yes, evaluate the next pair, 0 means no
for (i in 1:nrow(matrix)) {
if(evaluate == 1) {
if(matrix[i,6] == matrix[i+1,6]) {
counter <- counter + 1
evaluate <- 0
}
} else {
evaluate <- 1
}
}
此代码不能正常工作,但会让您了解如何处理问题。
替换&#34;矩阵&#34;使用矩阵的句柄(例如&#34; dat&#34;)并检查dat[i+1,6]
是否有效,如果没有j <- i + 1
和dat[i,6] == dat[j,6]
。
答案 1 :(得分:0)
可能是这样做的一种方式。
数据:
dput(mat1)
structure(c(9L, 9L, 3L, 9L, 18L, 24L, 6L, 2L, 4L, 4L, 4L, 5L,
5L, 4L, 4L, 5L, 3L, 5L, 5L, 5L, 2L, 1L, 1L, 2L, 4L, 4L, 1L, 4L,
2L, 2L, 1L, 1L, 5L, 14L, 24L, 30L, 31L, 34L, 34L, 34L, NA, 1L,
NA, NA, NA, NA, 1L, 1L, NA, NA, 7L, 7L, 10L, 7L, 10L, 10L, 10L,
7L, 7L, 7L), .Dim = c(10L, 6L), .Dimnames = list(NULL, c("V1",
"V2", "V3", "V4", "V5", "V6")))
功能: myfunc函数检查这些东西:
如果向量中的所有值都是NA或NA具有一个唯一值,则返回0
否则:
a)从矢量中删除NA并将其分配给变量&#39; x&#39;
b)删除&#39; x&#39;的索引。具有相同值的序列(例如:7,7,7,10,10,10),但保持索引值(例如:7,10)中的索引,并分配给&#39; A1&#39;变量
c)如果&#39; a1&#39;大于3,在其块中应用语句
d)否则,检查a1的长度是3或2或1或小于0并在其块中应用语句。如果条件为真,则返回其块中的值。
myfunc <- function(x){
if(length(unique(x[which(!is.na(x))])) <= 1){
return(0)
}else {
x = x[which(!is.na(x))]
a1 = which(diff(x) != 0)
if(length(a1) > 3){
b1 = a1[seq(1, length(a1), 2)]
b2 = a1[seq(2, length(a1), 2)]
return(length(b1) + sum(diff(b2) != 2))
} else {
if(length(a1) == 3){
count3 = sum(diff(a1) == 1)
if(count3 == 1 || count3 == 2){
return(2)
}else if(count3 == 0) {
return(3)
}
}else if(length(a1) == 2){
if(diff(a1) == 1){
return(1)
}else{
return(2)
}
}else if(length(a1) == 1){
return(1)
}else {
return(0)
}
}
}
}
将功能应用于数据&#39; mat1&#39;:
count = apply(mat1, 2, myfunc)
print(count)
# V1 V2 V3 V4 V5 V6
# 4 4 4 3 0 3
通过添加&#39; NA&#39>修改数据到第3行和第6列
mat1[3,6] = NA
mat1
# V1 V2 V3 V4 V5 V6
# [1,] 9 4 2 1 NA 7
# [2,] 9 5 1 1 1 7
# [3,] 3 5 1 5 NA NA
# [4,] 9 4 2 14 NA 7
# [5,] 18 4 4 24 NA 10
# [6,] 24 5 4 30 NA 10
# [7,] 6 3 1 31 1 10
# [8,] 2 5 4 34 1 7
# [9,] 4 5 2 34 NA 7
# [10,] 4 5 2 34 NA 7
将函数应用于修改后的数据
count = apply(mat1, 2, myfunc)
print(count)
# V1 V2 V3 V4 V5 V6
# 4 4 4 3 0 2