我有一个矩阵,其中包含表示数组中项目索引的整数值,我希望为值数组中的每个项目切换值[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的第一次迭代后发生变化,因为我想对任何不是很好的行为类型的对象执行此操作。
答案 0 :(得分: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))
}
测试
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)
}