将矩阵从模式A转换为模式B.

时间:2013-08-06 04:09:54

标签: r matrix logical-operators r-factor

非常简单的问题,我想以一般的方式提问,因为它似乎是一个经常出现的问题,我很乐意找到一种通用的方法来做到这一点。 例如,问题是将逻辑矩阵转换成因子矩阵,但保持矩阵结构:行数和数量。列,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班轮”)实际上适用于任何与因素无关的事情,我遇到了困难......

有什么想法吗? : - )

3 个答案:

答案 0 :(得分:5)

使用structure,它将属性列表附加到任意对象。对于矩阵,您需要的属性为dim,可选择dimnames

例如将X转换为因子矩阵:

m <- structure(factor(X), dim=dim(X), dimnames=dimnames(X))

答案 1 :(得分:2)

在@ HongOoi的优秀答案的基础上,这里的函数将保留输入矩阵的所有attributes(包括维度和维度名称),并将数据更改为所需的mode或{ {1}} numericmode 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