非常简单的问题,我想以一般的方式提问,因为它似乎是一个经常出现的问题,我很乐意找到一种通用的方法来做到这一点。 例如,问题是将逻辑矩阵转换成因子矩阵,但保持矩阵结构:行数和数量。列,colnames,rownames。我想要比
更直接的东西X2 <- matrix(as.mode(X), ncol=ncol(X));
rownames(X2) <- rownames(X) ...
我已经在某些情况下找到了这个问题,所以我把它放在这里,但仍有一些问题......
一个。进入( - >)因素是我没有简单的方法。
B中。 1.逻辑 - &gt; numeric:使用'+0'技巧
BoolMatrix <- matrix(c(TRUE,FALSE),nrow=3,ncol=2)
rownames(BoolMatrix) <- LETTERS[1:3]; colnames(BoolMatrix) <-LETTERS[11:12]
(NumMatrix <- BoolMatrix + 0)
B中。 2.数字 - &gt;逻辑:直接使用条件
NumMatrix <- matrix(1:6, ncol=2)
rownames(NumMatrix) <- LETTERS[1:3]; colnames(NumMatrix) <-LETTERS[11:12]
(BoolMatrix <- NumMatrix == 0)
℃。数字&lt; - &gt;性格:不能比2个衬垫更好,直接改变模式工作(也可以在逻辑和数字之间工作,但上面的解决方案更优雅)
CharMatrix <- NumMatrix
mode(CharMatrix) <-"character"
print(CharMatrix)
最后一个解决方案(“2班轮”)实际上适用于任何与因素无关的事情,我遇到了困难......
有什么想法吗? : - )
答案 0 :(得分:5)
使用structure
,它将属性列表附加到任意对象。对于矩阵,您需要的属性为dim
,可选择dimnames
。
例如将X
转换为因子矩阵:
m <- structure(factor(X), dim=dim(X), dimnames=dimnames(X))
答案 1 :(得分:2)
在@ HongOoi的优秀答案的基础上,这里的函数将保留输入矩阵的所有attributes
(包括维度和维度名称),并将数据更改为所需的mode
或{ {1}} numeric
,mode
factor
。
class
示例:
change.mat <- function(X,ch.fun) {
do.call(structure,c(list(.Data=do.call(ch.fun,list(X))),attributes(X)))
}
答案 2 :(得分:1)
您只需复制属性:
NumMatrix <- matrix(1:6, ncol=2)
rownames(NumMatrix) <- LETTERS[1:3]; colnames(NumMatrix) <-LETTERS[11:12]
FacMatrix <- as.factor(NumMatrix)
attributes(FacMatrix) <- c(attributes(FacMatrix), attributes(NumMatrix))
print(FacMatrix)
# K L
# A 1 4
# B 2 5
# C 3 6
# Levels: 1 2 3 4 5 6