作者d2389758 (花!)
看板Statistics
标题[程式] R 矩阵改数字
时间Wed May 2 19:18:11 2012
[软体程式类别]:
R
[程式问题]:
资料处理
[软体熟悉度]:
新手(不到1个月)
[问题叙述]:
我想把我的data变成矩阵
所以我先将data转成matrix後删掉前3个column 就是我想要的矩阵
然後将矩阵中所有的3跟4改成1 5改成NA
疑问是我试了两种方法 第一种方法就土法炼钢
自己先把column用cbind黏起来变成矩阵
genodat<-read.table("p1_mrk_001_mo.txt",header=FALSE)
SNP<-cbind(genodat[,4],genodat[,5],genodat[,6],genodat[,7],genodat[,8],
genodat[,9],genodat[,10],genodat[,11],genodat[,12],genodat[,13],genodat[,14]
,genodat[,15],genodat[,16],genodat[,17],genodat[,18],genodat[,19],genodat[,20]
,genodat[,21],genodat[,22],genodat[,23],genodat[,24],genodat[,25],genodat[,26]
,genodat[,27],genodat[,28],genodat[,29],genodat[,30],genodat[,31],genodat[,32]
,genodat[,33],genodat[,34],genodat[,35],genodat[,36],genodat[,37],genodat[,38]
,genodat[,39],genodat[,40],genodat[,41],genodat[,42],genodat[,43],genodat[,44]
,genodat[,45],genodat[,46],genodat[,47],genodat[,48],genodat[,49],genodat[,50]
,genodat[,51],genodat[,52],genodat[,53])
SNP[which(SNP==3)]<-1
SNP[which(SNP==4)]<-1
SNP[which(SNP==5)]<-NA
这个方法成功了 可是以後我要黏的column有上万个
总不能一个一个打吧QQ 我试过SNP<-genodat[,4:53]可是失败
第二个方法 我先将整个资料直接转成矩阵然後去掉前三个column
genodat<-as.matrix<-read.table("p1_mrk_001_mo.txt",header=FALSE)
genodat<-genodat[,-1]
genodat<-genodat[,-1]
SNP<-genodat[,-1]
到这里我成功得到我要的矩阵
但是下面改资料的步骤却失败了
SNP[which(SNP==3)]<-1
SNP[which(SNP==4)]<-1
SNP[which(SNP==5)]<-NA
Error in `[<-.data.frame`(`*tmp*`, which(genodat == 3), value = 1) :
new columns would leave holes after existing columns
我不知道第二个方法错在哪里以至於我无法得到第一个方法的结果
麻烦大家指点迷津 谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 193.170.62.226
1F:推 blackalert:首先,genodat[,4:53] 应该要可以才对... 05/02 20:18
2F:→ blackalert:其次,as.matrix是一个函数,用法是as.matrix(genodat) 05/02 20:20
3F:→ d2389758:我用genodat[,4:53]他就显示undefined columns selected 05/02 23:41
4F:→ d2389758:所以在方法一使用失败 05/02 23:45
5F:→ d2389758:不过我用第二种方法然後用as.matrix(genodat) 05/02 23:46
6F:→ d2389758:结果可以用genodat[,4:53] 可是改资料还是失败 05/02 23:46
7F:→ andrew43:是否确定原始档内所有资料都是数字及个数相等? 05/03 00:55
8F:→ d2389758:都是数字没错 column长度也一样(个数是在说这个吗?) 05/03 01:01
9F:→ clickhere:which 是多余的, which(SNP=1) 会拿到整个vector 05/03 01:57
10F:→ clickhere:改用scan取代read.table. 用 matrix() 转成矩阵 05/03 01:58
11F:→ clickhere:用 dim(genodat) 检查维度是否正确. str(genodat) 05/03 01:59
12F:→ clickhere:可以得知 genodat 的结构. 05/03 02:00
13F:推 memphis:要用which也可以 arr.ind 要开 05/03 16:52
14F:→ moonbat:data=as.matrix(read.table("p1_mrk_001_mo.txt")) 05/03 18:10
15F:→ moonbat:newdata=data[,4:length(data[1,])] 05/03 18:10
16F:→ moonbat:newdata[which(newdata)==3]=1 05/03 18:12
17F:→ moonbat:newdata[which(newdata)==4]=1 05/03 18:13
18F:→ moonbat:newdata[which(newdata)==5]=NA 05/03 18:13
19F:→ moonbat:应该这样就可以吧@@ newdata就是你要的 05/03 18:13
20F:→ gsuper:I服了U 05/03 18:25
21F:→ d2389758:感谢!我来试试看!!!! 05/03 21:24
22F:→ d2389758:moonbat方法我用失败了 感谢clickhere!!! 05/04 05:54
※ 编辑: d2389758 来自: 193.170.62.226 (05/04 05:58)
23F:→ d2389758:不过我用其他方法然後用which开arr.ind也失败 05/04 05:59
24F:→ clickhere:newdata[newdata==3]<-1 即可. which不是这样用的. 05/04 07:18
25F:→ moonbat:多谢楼上大人指正!!!感谢!!! 05/04 08:26
26F:→ moonbat:回d大 我不太懂你说的"用which开arr.ind"的意思? 05/04 08:35
27F:推 memphis:lala <- matrix(1:25, nrow=5) 05/04 11:32
28F:→ memphis:lala[which(lala==13, arr.ind=T)] <- 100 05/04 11:33
29F:→ moonbat:了解...囧 原来是在说这个,感谢楼上大人!! 05/04 11:34
30F:→ memphis:要在矩阵里用which, which输出要改成 array index type 05/04 11:35
31F:→ memphis:不过如clickhere所说 多此一举 用判断产生的T/F矩阵就ok 05/04 11:36