2014-03-31 123 views
0

我有一列如下。仅适用于非空元素,我想要得到如下所示的矩阵 。第6列代表实际值。R数据操纵矩阵

1 0 0 0 0 1 

0 1 0 0 0 2 

0 0 0 1 0 5 

任何提示什么是有效的方法来做到这一点?我应该使用哪些命令?我想到的是书面的,如果内for循环圈,但不认为这将是非常高效:(

abc=c('1','2','null','5','null') 
+0

什么实际价值呢?前5列中的1和0代表什么? –

回答

1

假设你的例子中有一个错误,t他仅仅是一个虚拟变量基本上编码:

abc <- c('1','2','null','5','null') 
abc <- factor(abc,levels=1:5) 
cbind(model.matrix(~abc+0),orig=na.omit(abc)) 

# abc1 abc2 abc3 abc4 abc5 orig 
#1 1 0 0 0 0 1 
#2 0 1 0 0 0 2 
#4 0 0 0 0 1 5 

如果你想自动计算的可能因素的范围,尝试:

abc <- c('1','2','null','5','null') 
rng <- range(as.numeric(abc),na.rm=TRUE) 
abc <- factor(abc,levels=seq(rng[1],rng[2])) 
cbind(model.matrix(~abc+0),orig=na.omit(abc)) 

# abc1 abc2 abc3 abc4 abc5 orig 
#1 1 0 0 0 0 1 
#2 0 1 0 0 0 2 
#4 0 0 0 0 1 5 
+0

六个元素宽度,我怎么能说包括除na之外的所有级别?我的原始数据是巨大的,我不想知道我的号码范围..如果我改变第一行abc < - 因素(abc),那么我得到额外的行为空值:( – user2543622

+0

@ user2543622 - 你可以单独计算范围 - 'rng < - 范围(as.numeric(abc),na.rm = TRUE)'并用它来确定因子的等级:因子(abc,levels = seq(rng [1],rng [2]) ) – thelatemail

+0

似乎不工作:(> rng < - 范围(as.numeric(abc),na.rm = TRUE) 警告消息: NAs强制引入 – user2543622

1

为什么矩阵是六个要素宽目前尚不清楚,但如果是长度(ABC)+ 1,则刚刚替补那表情我使用的6

> abcn <- as.numeric(abc) 
> zero <- matrix(0,nrow=length(abcn[!is.na(abcn)]), ncol=6) 
> zero[ cbind(1:3, which(!is.na(abcn))) ] <- 1 
> zero[ , 6] <- abcn[!is.na(abcn)] 
> zero 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 0 0 0 0 1 
[2,] 0 1 0 0 0 2 
[3,] 0 0 0 1 0 5 

您可以索引德[<-函数矩阵与双coulmn矩阵,这就是我在第三行正在做的,它的其余部分是普通矩阵索引

+0

我们再次被迫放弃纯粹的假设。哈哈。 –

+1

我的主要难题是第五栏。我想知道1是否应该在[3,5]。我们拭目以待。 –

+0

由于长度(abc)+1第一行中的第一个 – user2543622