Как уже отмечали другие, вам нужно немного уточнить свой вопрос, чтобы убедиться, что мы отвечаем на него правильно.
Я предполагаю, что вы соответствуете шаблону (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))
не удастся, потому что шаблон длиннее, чем количество столбцов.