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

作者: askpeople (就是要問!!!)   2018-01-06 17:03:49
[軟體程式類別]: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組,該怎麼存起來?
作者: clansoda (小笨)   2018-01-06 17:11:00
有點看不懂,你們複選題這邊不用boolean vector來存嗎?
作者: askpeople (就是要問!!!)   2018-01-06 17:15:00
樓上大大是說我的題項嗎?不知道你指的是否是我的迴圈中的儲存r22嗎?
作者: clansoda (小笨)   2018-01-06 17:21:00
我是指分析的時候,你們都是中文的話可能會沒那麼好做如果用boolean vector存複選題的題項會比較好分析
作者: askpeople (就是要問!!!)   2018-01-06 17:26:00
喔喔 了解了,你的意思是要我把中文欄位改掉囉?
作者: clansoda (小笨)   2018-01-06 17:26:00
你的這種存法會有很多空格吧,到時候要分析的時候會困難重重,除非你只想知道總數或比例之類的
作者: askpeople (就是要問!!!)   2018-01-06 17:27:00
然後選項儘量不要用中文我目前只是要統計出每個系在每個選項的數目分布而已
作者: clansoda (小笨)   2018-01-06 17:28:00
例如說你有一個複選題有20個選項 你就把column設成
作者: askpeople (就是要問!!!)   2018-01-06 17:28:00
這篇文章的重點就是迴圈寫法不知怎麼改
作者: askpeople (就是要問!!!)   2018-01-06 17:29:00
好,我會參考你說的 感謝
作者: celestialgod (天)   2018-01-06 19:01:00
R的stack不就可以直接完成嗎....或是reshape2,data.table的melt
作者: askpeople (就是要問!!!)   2018-01-06 20:56:00
對於r沒很熟悉 所以套件不太清楚@@ 我去研究一下
作者: clsmbstu   2018-01-07 01:08:00
reshape2::melt(data31, "系所")
作者: askpeople (就是要問!!!)   2018-01-07 11:29:00
很感謝上面的幾位大大指點指令與套件如果說我想練習迴圈,也是有辦法寫嗎?
作者: clsmbstu   2018-01-07 12:54:00
我想問題是出在 ri = cbind(data31[,1],data31[,i+1])R會以為你要把每次cbind的結果都存到叫"ri"的東西assign(paste0("r",i),cbind(data31[,1],data31[,i+1]))這樣寫才會每次把結果存進不同的variable 之後才能操弄不過等你學會lapply等function以後 應該會更喜歡把這些類似格式的資料(例如rXX)全部整理進一個list 更方便
作者: askpeople (就是要問!!!)   2018-01-10 12:14:00
之後我想把產生的r1,...r22合併 嘗試用以下寫法:r = paste0("r",1:22) 然後lapply(r, rbind)現在是希望把r1..r22塞到cbind裡面,可想不出好的方式我自己已經用melt處理過,但想增強寫迴圈的能力 (Orz)
作者: celestialgod (天)   2018-01-10 18:33:00
能不用迴圈就不要用迴圈...而且你好像沒分清楚變數名稱跟字串差異= =
作者: askpeople (就是要問!!!)   2018-01-11 09:31:00
我用paste0這樣,發現變成字串"r1"..所以不知道怎麼辦而assign我了解了一下,知道是給變數一個數值

Links booklink

Contact Us: admin [ a t ] ucptt.com