[問題] 依序比對變數產生新資料

看板R_Language作者 (SunnyGymBoy)時間10年前 (2015/08/02 23:03), 10年前編輯推噓0(0041)
留言41則, 3人參與, 最新討論串1/1
問題一 [問題類型]: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) [軟體熟悉度]: 新手(沒寫過程式,R 是我的第一次) 目前較懂得用packages做分析 但對於資料預處理還是不太熟悉 [問題敘述]: 我要怎麼找出該欄的最小三個值所對應之"列樣本" [程式範例]: #資料產生 sample1=sample(1:3,100,replace=T) sample2=sample(1:3,100,replace=T) sample3=sample(1:3,100,replace=T) sample4=sample(1:3,100,replace=T) sample5=sample(1:3,100,replace=T) data=as.data.frame(rbind(sample1,sample2,sample3,sample4,sample5)) #轉成類別型資料 for(i in 1:ncol(data)) data[,i]=as.factor(data[,i]) #計算樣本與樣本間相似程度,m表示距離矩陣,數值越小表示越相似 n=nrow(data) m=matrix(nrow=n,ncol=n) for(i in seq_len(n - 1)) for(j in seq(i, n)) m[j, i]=m[i, j]=sum(data[i,] != data[j,]) #m的輸出會長這樣,其中col1代表sample1,以此類推 col1 col2 col3 col4 col5 1 0 25 65 56 24 2 58 0 45 23 84 3 65 73 0 77 36 4 21 53 43 0 71 5 25 36 68 74 NA 問題:我要找col1中最小的兩個值之樣本,也就是4和5,有什麼語法可供參考嗎? 因為如果用which.min(data[,1])的話,只會得到4 問題二 [問題類型]: *[1;30;40m 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) *[m [軟體熟悉度]: *[1;30;40m請把以下不需要的部份刪除 新手(沒寫過程式,R 是我的第一次)*[m [問題敘述]: *[1;30;40m請簡略描述你所要做的事情,或是這個程式的目的*[m 現有三個樣本,每個樣本有100個變數,所以維度是3*100 我想依序比對這三個樣本之變數來產生第四個樣本(圖示a) 在產生的過程中 該變數以多數決的方式產生第四個樣本之變數(圖示b) 若遇到無法以多數決的方式產生之情況(圖示c) 就截至比對目前結果為止,找出三個樣本哪個與第四個樣本最接近 並根據此樣本的值去產生該變數(說明d) a. V1 V2 V3 V4 V5 V6 V7 ... ... V100 sample1 1 3 2 3 1 3 2 ... ... 1 sample2 3 2 1 3 2 1 3 ... ... 1 sample3 1 3 2 3 1 3 1 ... ... 2 sample4 1 3 2 3 1 3 2 ... ... 1 b.(以V1為例) V1 V2 V3 V4 V5 V6 V7 ... ... V100 sample1 "1" 3 2 3 1 3 2 ... ... 1 sample2 3 2 1 3 2 1 3 ... ... 1 sample3 "1" 3 2 3 1 3 1 ... ... 2 sample4 1 3 2 3 1 3 2 ... ... 1 c.(以V7為例) V1 V2 V3 V4 V5 V6 V7 ... ... V100 sample1 1 3 2 3 1 3 "2" ... ... 1 sample2 3 2 1 3 2 1 "3" ... ... 1 sample3 1 3 2 3 1 3 "1" ... ... 2 sample4 1 3 2 3 1 3 2 ... ... 1 d. 因為到V7卡住,所以先對Sample1到Sample4(V1~V6)算一次相似程度 計算的方式與問題一相同,所以比對程序截至到V6,此時的距離矩陣為 col1 col2 col3 col4 1 0 5 0 0 2 5 0 5 5 3 0 5 0 0 4 0 5 0 NA (情況1)從結果可知 第四個樣本(col4)與第一與第三個樣本較相似 此時可根據第一與第三個樣本的V7,第四個樣本的V7可任意填入2或1 (情況2) col1 col2 col3 col4 1 0 5 0 0 2 5 0 5 5 3 0 5 0 "1" 4 0 5 0 NA 如果今天算出來的距離矩陣是這樣 就可以很確定第四個樣本的V7要填入2 [程式範例]: sample1=sample(1:3,100,replace=T) sample2=sample(1:3,100,replace=T) sample3=sample(1:3,100,replace=T) data=as.data.frame(rbind(sample1,sample2,sample3)) 接下來就請各位前輩多多提點一下了~感謝幫忙 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.184.161.128 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1438527811.A.57F.html ※ 編輯: sinclairJ (111.184.161.128), 08/02/2015 23:06:27

08/02 23:23, , 1F
1. order(m$col1)
08/02 23:23, 1F

08/02 23:25, , 2F
2. 有點複雜。沒有例外大概從眾數下手。
08/02 23:25, 2F

08/02 23:26, , 3F
因為眾數不一定唯一或存在,所以看你眾數的例外處理如何
08/02 23:26, 3F

08/02 23:27, , 4F
才能再繼續寫下去。
08/02 23:27, 4F

08/02 23:28, , 5F
可以從table(foo)來檢查foo的頻率,這大概是第一步。
08/02 23:28, 5F

08/02 23:30, , 6F
因為只會用三個樣本去生成一個樣本 所以我目前想到的
08/02 23:30, 6F

08/02 23:30, , 7F
處理方式就是情況1與情況2 嗚嗚
08/02 23:30, 7F

08/02 23:31, , 8F
另外我覺得先不要看多個變數。一次解一個變數,再套用。
08/02 23:31, 8F

08/02 23:36, , 9F
哦~從變數的角度下去看就是了 謝謝a大建議 我在想想~
08/02 23:36, 9F

08/02 23:41, , 10F
1. 建議你的m 對角線都變更成NA
08/02 23:41, 10F

08/02 23:42, , 11F
不然你的order取下去可能有問題
08/02 23:42, 11F

08/02 23:53, , 12F
目前想到用recode 但會把將非對角線的0也取代
08/02 23:53, 12F

08/02 23:53, , 13F

08/02 23:54, , 14F
library(Matrix)沒用到
08/02 23:54, 14F

08/02 23:54, , 15F
library(car);recode(m,"0=NA")
08/02 23:54, 15F

08/02 23:55, , 16F
你如果遇到有0個相等怎麼辦?
08/02 23:55, 16F

08/02 23:59, , 17F
沒有一定要找一模一樣的 就找距離最小的 所以如果
08/02 23:59, 17F

08/03 00:00, , 18F
第四個樣本所對應第一,二及三的距離為 11,20,5(舉例)
08/03 00:00, 18F

08/03 00:00, , 19F
那就以第三個樣本為基準去填補第四個樣本之該變數
08/03 00:00, 19F

08/03 00:06, , 20F
我的意思是你用recode會有問題
08/03 00:06, 20F

08/03 00:07, , 21F
如果你要用那個距離矩陣算order的話
08/03 00:07, 21F

08/03 00:08, , 22F
第二個問題只要算一行的相似矩陣,不建議算整個矩陣
08/03 00:08, 22F

08/03 00:15, , 23F
哦 了解了 謝C大提醒
08/03 00:15, 23F

08/03 00:19, , 24F
還有一件事,你生成的資料,每一行的levels是不同,
08/03 00:19, 24F

08/03 00:19, , 25F
計算相等會有問題...
08/03 00:19, 25F

08/03 00:20, , 26F
如果轉成as.character會能解決嗎?
08/03 00:20, 26F

08/03 00:20, , 27F
當然我連結的生成方式也是有問題
08/03 00:20, 27F

08/03 00:20, , 28F
可以解決
08/03 00:20, 28F

08/03 00:21, , 29F
建議不要factor了,直接用character或是int做
08/03 00:21, 29F

08/03 00:23, , 30F
OK~謝C大提醒
08/03 00:23, 30F

08/03 20:57, , 31F

08/03 20:58, , 32F
有參考網路上這個寫法,能取出每個column的眾數,不過
08/03 20:58, 32F

08/03 20:59, , 33F
遇到該col是0,1,2的時候就會掛掉,請問該怎麼在functio
08/03 20:59, 33F

08/03 20:59, , 34F
n裡加入條件式比較好?
08/03 20:59, 34F

08/03 21:20, , 35F
直接在>1那裏改就好
08/03 21:20, 35F

08/03 21:42, , 36F
08/03 21:42, 36F

08/03 21:42, , 37F
我不知道你距離相等怎麼做,我直接幫你設定隨機抽
08/03 21:42, 37F

08/03 21:45, , 38F
最後再去改算不出mode的部分,會比較有效率
08/03 21:45, 38F

08/03 21:46, , 39F
why colwise 請看#1LeXNCKV (R_Language)
08/03 21:46, 39F

08/04 01:32, , 40F
有try了一下 目前尚未遇到問題 謝謝C大幫忙
08/04 01:32, 40F

08/04 01:32, , 41F
會問題在推文詢問你了~感謝!
08/04 01:32, 41F
文章代碼(AID): #1LlZ53L_ (R_Language)
文章代碼(AID): #1LlZ53L_ (R_Language)