首页 > 解决方案 > 替换矩阵中相互跟随的特定数字

问题描述

我正在处理调查数据,我想在数据框中替换特定的值 - 它们彼此跟随。

例如

   v1   v2   v3   v4  v5
   0    2    0    0   55
   0    0    3    0    1
   3    0    1    1    2
   0    2    0    2    0

如果我将 (0,2,0) 替换为 1,将数据帧的其余部分替换为 0,则新矩阵将如下所示

   v1   v2   v3   v4  v5
   1    1    1    0    0
   0    0    0    0    0
   0    0    0    0    0
   1    1    1    1    1

我怎样才能对 n 长度的特定数字执行此操作,即 (1,3);(1,2,4,5,8,2)?

标签: rdataframematrix

解决方案


正如其他人指出的那样,您需要稍微澄清一下您的问题,以确保我们正确回答它。

我的假设是,您正在匹配c(0,2,0)您展示的示例中的模式 (),并且您只匹配跨行的模式。也就是说,它不能从第 2 行第 5 列换行到第 3 行第 1 列,也不会只检查列中的匹配项。

如果这些假设是正确的,那么以下函数将起作用。它复制了您提供的示例,并返回一个矩阵。您可以使用可选参数分别修改示例中的替换值 ( rep_val) 和填充值 ( )、1 和 0。fill_val此功能也可以改进为更优雅,但我认为它有效。


代码

replace_pattern <- function(x, pattern, rep_with = 1, fill_val = 0)
{
  n <- length(pattern)
  if (n > ncol(x))
    stop("pattern is longer than number of columns")

  new_x <- matrix(fill_val, nrow = nrow(x), ncol = ncol(x))

  # loop over each row
  for (rr in seq_len(nrow(x))) {
    # start matching the pattern at the entry = length of pattern
    # and look backwards
    for (cc in n:ncol(x)) {
      cur_cols <- (cc - n + 1):cc
      cur_vals <- x[rr, cur_cols]

      # if it matches the pattern, replace the values with specified value
      if (isTRUE(all.equal(cur_vals, pattern, check.attributes = FALSE))) {
        new_x[rr, cur_cols] <- rep_with
      }
    }
  }

  new_x
}

测试

使用您的示例,并将其设置为xx

xx

v1   v2   v3   v4  v5
0    2    0    0   55
0    0    3    0    1
3    0    1    1    2
0    2    0    2    0

然后调用replace_pattern(xx, c(0, 2, 0))返回您提供的第二个矩阵。

x2 <- xx
x2[2, 2] <- 1
replace_pattern(x2, c(1, 3))

回报:

     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    1    1    0    0
[3,]    0    0    0    0    0
[4,]    0    0    0    0    0

xx3 <- rbind(xx, c(1, 2, 4, 5, 8))
replace_pattern(xx3, c(1, 2, 4, 5, 8))

回报:

     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    0    0    0    0
[3,]    0    0    0    0    0
[4,]    0    0    0    0    0
[5,]    1    1    1    1    1

最后,replace_pattern(xx, c(1,2,4,5,8,2))会因为模式长于列数而失败。


推荐阅读