[程式] R 矩陣改數字

看板Statistics作者 (花!)時間12年前 (2012/05/02 19:18), 編輯推噓3(3028)
留言31則, 7人參與, 最新討論串1/1
[軟體程式類別]: 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

05/02 20:18, , 1F
首先,genodat[,4:53] 應該要可以才對...
05/02 20:18, 1F

05/02 20:20, , 2F
其次,as.matrix是一個函數,用法是as.matrix(genodat)
05/02 20:20, 2F

05/02 23:41, , 3F
我用genodat[,4:53]他就顯示undefined columns selected
05/02 23:41, 3F

05/02 23:45, , 4F
所以在方法一使用失敗
05/02 23:45, 4F

05/02 23:46, , 5F
不過我用第二種方法然後用as.matrix(genodat)
05/02 23:46, 5F

05/02 23:46, , 6F
結果可以用genodat[,4:53] 可是改資料還是失敗
05/02 23:46, 6F

05/03 00:55, , 7F
是否確定原始檔內所有資料都是數字及個數相等?
05/03 00:55, 7F

05/03 01:01, , 8F
都是數字沒錯 column長度也一樣(個數是在說這個嗎?)
05/03 01:01, 8F

05/03 01:57, , 9F
which 是多餘的, which(SNP=1) 會拿到整個vector
05/03 01:57, 9F

05/03 01:58, , 10F
改用scan取代read.table. 用 matrix() 轉成矩陣
05/03 01:58, 10F

05/03 01:59, , 11F
用 dim(genodat) 檢查維度是否正確. str(genodat)
05/03 01:59, 11F

05/03 02:00, , 12F
可以得知 genodat 的結構.
05/03 02:00, 12F

05/03 16:52, , 13F
要用which也可以 arr.ind 要開
05/03 16:52, 13F

05/03 18:10, , 14F
data=as.matrix(read.table("p1_mrk_001_mo.txt"))
05/03 18:10, 14F

05/03 18:10, , 15F
newdata=data[,4:length(data[1,])]
05/03 18:10, 15F

05/03 18:12, , 16F
newdata[which(newdata)==3]=1
05/03 18:12, 16F

05/03 18:13, , 17F
newdata[which(newdata)==4]=1
05/03 18:13, 17F

05/03 18:13, , 18F
newdata[which(newdata)==5]=NA
05/03 18:13, 18F

05/03 18:13, , 19F
應該這樣就可以吧@@ newdata就是你要的
05/03 18:13, 19F

05/03 18:25, , 20F
I服了U
05/03 18:25, 20F

05/03 21:24, , 21F
感謝!我來試試看!!!!
05/03 21:24, 21F

05/04 05:54, , 22F
moonbat方法我用失敗了 感謝clickhere!!!
05/04 05:54, 22F
※ 編輯: d2389758 來自: 193.170.62.226 (05/04 05:58)

05/04 05:59, , 23F
不過我用其他方法然後用which開arr.ind也失敗
05/04 05:59, 23F

05/04 07:18, , 24F
newdata[newdata==3]<-1 即可. which不是這樣用的.
05/04 07:18, 24F

05/04 08:26, , 25F
多謝樓上大人指正!!!感謝!!!
05/04 08:26, 25F

05/04 08:35, , 26F
回d大 我不太懂你說的"用which開arr.ind"的意思?
05/04 08:35, 26F

05/04 11:32, , 27F
lala <- matrix(1:25, nrow=5)
05/04 11:32, 27F

05/04 11:33, , 28F
lala[which(lala==13, arr.ind=T)] <- 100
05/04 11:33, 28F

05/04 11:34, , 29F
了解...囧 原來是在說這個,感謝樓上大人!!
05/04 11:34, 29F

05/04 11:35, , 30F
要在矩陣裡用which, which輸出要改成 array index type
05/04 11:35, 30F

05/04 11:36, , 31F
不過如clickhere所說 多此一舉 用判斷產生的T/F矩陣就ok
05/04 11:36, 31F
文章代碼(AID): #1FeHVsH1 (Statistics)