2015-08-31 5 views
0

Я хочу применить определенную пользователем функцию к объекту матрицы. У меня нет желаемых результатов, мой вход - это матрица 4x4, и я хочу получить в качестве вывода матрицу 4x4 с преобразованием, определенным в функции mapfun.применить функцию в R

Где моя ошибка?

Заранее спасибо

mapfun <- function(val){ 
if (val == 1){ 
res <- "A" } 
else{ 
if (val == 2){ 
    res <- "B" 
} else 
{ 
    if (val == 3){ 
    res <- "C" 
    } else 
    { 
    res <- "D" 
    } 
    } 
} 
return(res) 
} 

mat1 <- matrix(sample(c(1,2,3,4), 16, replace=T, prob=c(0.25,0.25,0.25,0.25)), 
      nrow=4, ncol=4) 

mat2 <- apply(mat1, 1, FUN=mapfun)` 
+3

Возможно, вы ищете 'apply (mat1, c (1,2), FUN = mapfun)'. –

ответ

3

Мы можем только числовые значения в «MAT1» в качестве индекса для замены соответствующих «букв». Выход будет vector, который может быть преобразован обратно в matrix, назначив dim.

`dim<-`(LETTERS[mat1], dim(mat1)) 

Что касается сообщения предупреждения в mapfun, было бы лучше использовать ifelse вместо if/else, как мы имеем дело с vector длиной более 1 в каждой строке «MAT1».

mapfun <- function(val){ 
    ifelse(val == 1, 'A', 
     ifelse(val==2, 'B', 
      ifelse(val==3, 'C', 'D'))) 
    } 
apply(mat1, 1, mapfun) 
1

Это, вероятно, может работать:

mat1[] <- mapply(mapfun,mat1) 

Обратите внимание, что это изменит mat1, так что вы можете сделать копию mat1 имени mat2 и применить функцию к mat2:

mat2<- mat1 
mat2[] <- mapply(mapfun,mat1) 
0

Вы можете попробовать это (забавное) решение. Сначала вы принудительно вводите значение значения в вектор символа, а затем повторно используете функцию replace и возвращаете результат в виде матрицы снова. Может быть, есть способ обмануть функцию replace так, чтобы она использовалась только один раз.

mapfun <- function(val) { 
    res <- as.character(val) 
    res <- replace(x = res, list = which(res == "1"), values = "A") 
    res <- replace(x = res, list = which(res == "2"), values = "B") 
    res <- replace(x = res, list = which(res == "3"), values = "C") 
    res <- replace(x = res, list = which(res == "4"), values = "D") 
    return(matrix(res, ncol = 4)) # ncol(val) 
} 

mat1 <- matrix(sample(c(1,2,3,4), 16, replace=T, prob=c(0.25,0.25,0.25,0.25)), 
       nrow=4, ncol=4) 
mat1 
mapfun(mat1) 
+1

Вы можете написать это как просто «replace (mat1, seq_along (mat1), LETTERS [mat1])' –

+0

Это просто удивительно, сколько «длиннее» и «короче», «хуже» и «лучше» (и так далее). ..) решений есть :) –

Смежные вопросы