我有一列如下。仅适用于非空元素,我想要得到如下所示的矩阵 。第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')
我有一列如下。仅适用于非空元素,我想要得到如下所示的矩阵 。第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')
假设你的例子中有一个错误,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
六个元素宽度,我怎么能说包括除na之外的所有级别?我的原始数据是巨大的,我不想知道我的号码范围..如果我改变第一行abc < - 因素(abc),那么我得到额外的行为空值:( – user2543622
@ user2543622 - 你可以单独计算范围 - 'rng < - 范围(as.numeric(abc),na.rm = TRUE)'并用它来确定因子的等级:因子(abc,levels = seq(rng [1],rng [2]) ) – thelatemail
似乎不工作:(> rng < - 范围(as.numeric(abc),na.rm = TRUE) 警告消息: NAs强制引入 – user2543622
为什么矩阵是六个要素宽目前尚不清楚,但如果是长度(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矩阵,这就是我在第三行正在做的,它的其余部分是普通矩阵索引
什么实际价值呢?前5列中的1和0代表什么? –