基于值替换矩阵中的项目

时间:2014-12-14 10:49:24

标签: r matrix replace

我有一个矩阵,其中包含表示数组中项目索引的整数值,我希望为值数组中的每个项目切换值[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并将其变成" a"等等。看起来如果我尝试用for循环执行此操作,它会在从int到string的第一次迭代后发生变化,因为我想对任何不是很好的行为类型的对象执行此操作。

2 个答案:

答案 0 :(得分:2)

我可以想到解决这个问题的三种可能性

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

1

定义一个函数,该函数将以正确的匹配顺序获取向量(第一个条目将匹配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" 

2

第二个选项是定义手动替换功能,如

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" 

第3

您还可以使用plyr::revalue

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

测试

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" 

注意:如果您不想替换所有唯一值,最后一种方法是最安全的

答案 1 :(得分: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)
    }