作者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