R按顺序查找列值的变化,并对整个数据矩阵进行计数

时间:2015-04-10 09:40:07

标签: r

我有一个像这样的大矩阵:

      [,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

有人建议怎么做吗?

2 个答案:

答案 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 + 1dat[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函数检查这些东西:

  1. 如果向量中的所有值都是NA或NA具有一个唯一值,则返回0

  2. 否则:

    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)
               }
          }
       }
    }
    
  3. 将功能应用于数据&#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