2014-12-14 3 views
0

У меня есть матрица, которая содержит целочисленные значения, которые представляют индекс элемента в массиве, и я хотел бы отключить элемент 1 для значений [1] и т. Д. Для каждого элемента в массиве значений.Замените элементы в матрице на основе значения

Часть кода, чтобы продемонстрировать, что я хотел бы

> m = matrix(1:3, ncol=3, nrow=3) 
> m 
    [,1] [,2] [,3] 
[1,] 1 1 1 
[2,] 2 2 2 
[3,] 3 3 3 
> replace(m, 1="a", 2="b", 3="c") 
> m 
    [,1] [,2] [,3] 
[1,] "a" "a" "a" 
[2,] "b" "b" "b" 
[3,] "c" "c" "c" 

В основном это занимает 1 и превращает его в «а» и так далее. Похоже, если я попытаюсь сделать это с циклом for, он изменится после первой итерации от int до строки, и поскольку я хотел бы сделать это с любым типом объекта, это не очень хорошо.

+0

Я не имею ни малейшего представления о том, что это вопрос, но вы ищете нечто вроде '' dim <- "(буквы [m], dim (m))'? –

+0

Будет ли это ограничено 1, 2, 3 и a, b, c, или вам нужно более общее решение? –

+0

Мне нужно общее решение, которое заменяет каждый элемент, который соответствует значению с другим элементом. В приведенном выше случае я пишу 1 = "a", чтобы указать, что все 1 значения будут заменены на строку "a". Левая часть уравнения всегда будет целочисленными значениями, но правая сторона может быть любой, в этом случае это строка, но она может быть от другого целого к функции. – Coat

ответ

2

я могу думать о трех возможностей решить эту

m <- matrix(1:3, 3, 3) # Your data 

Либо определить функцию, которая будет получить вектор в правильном порядке согласования (первый запись будет соответствовать первому уникальному значению в m и т. д.)

vec <- c("Ralf", "Jhons", "Pete") 

Затем вы можете определить простую функцию, такую ​​как

Match_func <- function(x, y) "dim<-"(y[match(unique(x), seq_along(y))], dim(x)) 

Тест

Match_func(m, vec) 
#  [,1] [,2] [,3] 
# [1,] "Ralf" "Ralf" "Ralf" 
# [2,] "Jhons" "Jhons" "Jhons" 
# [3,] "Pete" "Pete" "Pete" 

Второй вариант будет определять вашу ручную функцию замены , что-то вроде

Match_func2 <- function(x, ...) { 
    temp <- list(...)[[1]] 
    "dim<-"(temp[match(x, as.numeric(names(temp)))], dim(x)) 
} 

Тест

Match_func2(m, c("1" = "a", "2" = "b", "3" = "c")) 
#  [,1] [,2] [,3] 
# [1,] "a" "a" "a" 
# [2,] "b" "b" "b" 
# [3,] "c" "c" "c" 

Вы также можете сделать использование plyr::revalue

library(plyr) 
Match_func3 <- function(x, ...) { 
    temp <- list(...)[[1]] 
    "dim<-"(revalue(as.character(x), temp), dim(x)) 
} 

Test

Match_func3(m, c("1" = "a", "2" = "b", "3" = "c")) 
#  [,1] [,2] [,3] 
# [1,] "a" "a" "a" 
# [2,] "b" "b" "b" 
# [3,] "c" "c" "c" 

Примечание: Последний подход является безопасным в случае, если вы не хотите, чтобы заменить все уникальные значения

0

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

m = matrix(as.character(1:3), ncol=3, nrow=3) 
old <- as.character(1:3) 
new <- c("a", "b", "c") 
for (i in 1:length(old)) { 
    m <- ifelse(m == old[i], new[i], m) 
    } 
Смежные вопросы