[問題] R怎麼做多組資料合併? (for迴圈問題)

看板R_Language作者 (就是要問!!!)時間6年前 (2018/01/06 17:03), 編輯推噓2(2032)
留言34則, 4人參與, 6年前最新討論串1/2 (看更多)
[軟體程式類別]:R [程式問題]:for迴圈不知道怎麼寫比較好? [軟體熟悉度]:新手 [問題敘述]: 我想問的是: 如果希望整欄的資料做多次合併,有辦法用迴圈寫嗎? 現在有一個問卷資料,題項有22欄,是由7個系共185位同學填寫 資料形態如下: https://imgur.com/a/6gJdq (每個題項一共有185筆資料、共23個題項、7個系的同學填答) 這題是複選題,我必須要統計出每個系回答題項的數目分布 1.要第1欄 (系所) + 第2欄 (題項1) = 1組資料 以此類推...一共有22組資料 2.將22組資料合併,就可以統計出每個系的題項分布,於是我用圖法煉鋼方式寫了如 (1) 但重點來了,我要問的就是: 有辦法用迴圈寫嗎? 但我用for迴圈寫如下面 (2), 因為沒寫過整組資料的合併,不知道問題出在那? 可以幫我看一下嗎? (1) 圖法煉鋼 (確實可以正確合併,但花時間) #data名稱是data31 #1使用cbind合併... r1 =cbind(data31[,1],data31[,2]) r2 =cbind(data31[,1],data31[,3]) r3 =cbind(data31[,1],data31[,4]) ..... r22 =cbind(data31[,1],data31[,23]) #2使用rbind合併,得到最後的rf大矩陣 rf = rbind(r1,r2,r3...r22) (2) for迴圈 : 遇到問題 n = 22 r22 = matrix() for (i in 1:n) { ri = cbind(data31[,1],data31[,i+1]) } r22 因為這個是要把整組資料做合併,並非一個一個,所以我明知道迴圈有 問題,確不知道怎麼改? 可以指點我一下嗎? 我知道要給定一個矩陣讓迴圈儲存 可是我有22組,該怎麼存起來? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.192.231.179 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1515229432.A.E9C.html

01/06 17:11, 6年前 , 1F
有點看不懂,你們複選題這邊不用boolean vector來存嗎?
01/06 17:11, 1F

01/06 17:15, 6年前 , 2F
樓上大大是說我的題項嗎?
01/06 17:15, 2F

01/06 17:16, 6年前 , 3F
不知道你指的是否是我的迴圈中的儲存r22嗎?
01/06 17:16, 3F

01/06 17:21, 6年前 , 4F
我是指分析的時候,你們都是中文的話可能會沒那麼好做
01/06 17:21, 4F

01/06 17:21, 6年前 , 5F
如果用boolean vector存複選題的題項會比較好分析
01/06 17:21, 5F

01/06 17:26, 6年前 , 6F
喔喔 了解了,你的意思是要我把中文欄位改掉囉?
01/06 17:26, 6F

01/06 17:26, 6年前 , 7F
你的這種存法會有很多空格吧,到時候要分析的時候
01/06 17:26, 7F

01/06 17:27, 6年前 , 8F
會困難重重,除非你只想知道總數或比例之類的
01/06 17:27, 8F

01/06 17:27, 6年前 , 9F
然後選項儘量不要用中文
01/06 17:27, 9F

01/06 17:28, 6年前 , 10F
我目前只是要統計出每個系在每個選項的數目分布而已
01/06 17:28, 10F

01/06 17:28, 6年前 , 11F
例如說你有一個複選題有20個選項 你就把column設成
01/06 17:28, 11F

01/06 17:28, 6年前 , 12F
這篇文章的重點就是迴圈寫法不知怎麼改
01/06 17:28, 12F

01/06 17:28, 6年前 , 13F
2-1, 2-2 ..... 2-20
01/06 17:28, 13F

01/06 17:29, 6年前 , 14F
好,我會參考你說的 感謝
01/06 17:29, 14F

01/06 19:01, 6年前 , 15F
R的stack不就可以直接完成嗎....
01/06 19:01, 15F

01/06 19:02, 6年前 , 16F
或是reshape2,data.table的melt
01/06 19:02, 16F

01/06 20:56, 6年前 , 17F
對於r沒很熟悉 所以套件不太清楚@@ 我去研究一下
01/06 20:56, 17F

01/07 01:08, 6年前 , 18F
reshape2::melt(data31, "系所")
01/07 01:08, 18F

01/07 11:29, 6年前 , 19F
很感謝上面的幾位大大指點指令與套件
01/07 11:29, 19F

01/07 11:29, 6年前 , 20F
如果說我想練習迴圈,也是有辦法寫嗎?
01/07 11:29, 20F

01/07 12:54, 6年前 , 21F
我想問題是出在 ri = cbind(data31[,1],data31[,i+1])
01/07 12:54, 21F

01/07 12:55, 6年前 , 22F
R會以為你要把每次cbind的結果都存到叫"ri"的東西
01/07 12:55, 22F

01/07 12:58, 6年前 , 23F
assign(paste0("r",i),cbind(data31[,1],data31[,i+1]))
01/07 12:58, 23F

01/07 12:59, 6年前 , 24F
這樣寫才會每次把結果存進不同的variable 之後才能操弄
01/07 12:59, 24F

01/07 12:59, 6年前 , 25F
不過等你學會lapply等function以後 應該會更喜歡把這些
01/07 12:59, 25F

01/07 13:00, 6年前 , 26F
類似格式的資料(例如rXX)全部整理進一個list 更方便
01/07 13:00, 26F

01/10 12:14, 6年前 , 27F
之後我想把產生的r1,...r22合併 嘗試用以下寫法:
01/10 12:14, 27F

01/10 12:14, 6年前 , 28F
r = paste0("r",1:22) 然後lapply(r, rbind)
01/10 12:14, 28F

01/10 12:16, 6年前 , 29F
現在是希望把r1..r22塞到cbind裡面,可想不出好的方式
01/10 12:16, 29F

01/10 12:16, 6年前 , 30F
我自己已經用melt處理過,但想增強寫迴圈的能力 (Orz)
01/10 12:16, 30F

01/10 18:33, 6年前 , 31F
能不用迴圈就不要用迴圈...
01/10 18:33, 31F

01/10 18:33, 6年前 , 32F
而且你好像沒分清楚變數名稱跟字串差異= =
01/10 18:33, 32F

01/11 09:31, 6年前 , 33F
我用paste0這樣,發現變成字串"r1"..所以不知道怎麼辦
01/11 09:31, 33F

01/11 09:33, 6年前 , 34F
而assign我了解了一下,知道是給變數一個數值
01/11 09:33, 34F
文章代碼(AID): #1QK93uwS (R_Language)
文章代碼(AID): #1QK93uwS (R_Language)