Заменить конкретные числа, которые следуют друг за другом в матрице - PullRequest
0 голосов
/ 05 января 2019

Я работаю с данными опроса и хочу заменить определенные значения, которые следуют друг за другом, во фрейме данных.

Например

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

1 Ответ

0 голосов
/ 05 января 2019

Как уже отмечали другие, вам нужно немного уточнить свой вопрос, чтобы убедиться, что мы отвечаем на него правильно.

Я предполагаю, что вы соответствуете шаблону (c(0,2,0)) в примере, который вы показываете, и вы сопоставляете шаблон только по строкам. То есть он не может переноситься из строки 2, столбца 5 в строку 3, столбец 1, а также проверять совпадения только в столбцах.

Если эти предположения верны, то будет работать следующая функция. Он повторяет приведенный вами пример и возвращает матрицу. Вы можете изменить значения замены (rep_val) и значения заполнения (fill_val), 1 и 0 в вашем примере, соответственно, с помощью дополнительных параметров. Эту функцию также можно улучшить, чтобы она была более элегантной, но я думаю, что она работает.


код

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)) не удастся, потому что шаблон длиннее, чем количество столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...