【问题标题】:R Find changes in values of a column sequentially and count them for entire matrix of dataR按顺序查找列值的变化并为整个数据矩阵计算它们
【发布时间】:2015-04-10 09:40:06
【问题描述】:

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

      [,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 行中的第 6 列从 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

有没有人建议如何做到这一点?

【问题讨论】:

    标签: r


    【解决方案1】:

    做一个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
        }
    }
    

    此代码不能按原样工作,但可以让您了解如何处理您的问题。

    将“matrix”替换为您的矩阵句柄(例如“dat”)并检查dat[i+1,6] 是否有效,如果无效则为j &lt;- i + 1 和dat[i,6] == dat[j,6]。

    【讨论】:

      【解决方案2】:

      可能是一种方法。

      数据:

      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 并将其分配给变量 'x'

        b) 删除具有相同值序列的“x”的索引(例如:7,7,7,10,10,10),但在值有差异的地方保留索引(例如: 7,10) 并分配给 'a1' 变量

        c) 如果 'a1' 的长度大于 3,则应用其块内的语句

        d) 否则,检查 a1 的长度是否为 3 或 2 或 1 或小于 0,并在其块中应用语句 with。如果条件为真,则返回其块中的值。

        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)
                   }
              }
           }
        }
        

      将函数应用于数据'mat1':

      count = apply(mat1, 2, myfunc)
      
      print(count)
      # V1 V2 V3 V4 V5 V6 
      #  4  4  4  3  0  3 
      

      通过将“NA”添加到第 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 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-24
        • 1970-01-01
        • 1970-01-01
        • 2022-08-11
        相关资源
        最近更新 更多