作者askpeople (就是要问!!!)
看板R_Language
标题[问题] R怎麽做多组资料合并? (for回圈问题)
时间Sat Jan 6 17:03:49 2018
[软体程式类别]: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://webptt.com/cn.aspx?n=bbs/R_Language/M.1515229432.A.E9C.html
1F:→ clansoda: 有点看不懂,你们复选题这边不用boolean vector来存吗? 01/06 17:11
2F:→ askpeople: 楼上大大是说我的题项吗? 01/06 17:15
3F:→ askpeople: 不知道你指的是否是我的回圈中的储存r22吗? 01/06 17:16
4F:→ clansoda: 我是指分析的时候,你们都是中文的话可能会没那麽好做 01/06 17:21
5F:→ clansoda: 如果用boolean vector存复选题的题项会比较好分析 01/06 17:21
6F:→ askpeople: 喔喔 了解了,你的意思是要我把中文栏位改掉罗? 01/06 17:26
7F:→ clansoda: 你的这种存法会有很多空格吧,到时候要分析的时候 01/06 17:26
8F:→ clansoda: 会困难重重,除非你只想知道总数或比例之类的 01/06 17:27
9F:→ askpeople: 然後选项尽量不要用中文 01/06 17:27
10F:→ askpeople: 我目前只是要统计出每个系在每个选项的数目分布而已 01/06 17:28
11F:→ clansoda: 例如说你有一个复选题有20个选项 你就把column设成 01/06 17:28
12F:→ askpeople: 这篇文章的重点就是回圈写法不知怎麽改 01/06 17:28
13F:→ clansoda: 2-1, 2-2 ..... 2-20 01/06 17:28
14F:→ askpeople: 好,我会参考你说的 感谢 01/06 17:29
15F:→ celestialgod: R的stack不就可以直接完成吗.... 01/06 19:01
16F:推 celestialgod: 或是reshape2,data.table的melt 01/06 19:02
17F:→ askpeople: 对於r没很熟悉 所以套件不太清楚@@ 我去研究一下 01/06 20:56
18F:推 clsmbstu: reshape2::melt(data31, "系所") 01/07 01:08
19F:→ askpeople: 很感谢上面的几位大大指点指令与套件 01/07 11:29
20F:→ askpeople: 如果说我想练习回圈,也是有办法写吗? 01/07 11:29
21F:→ clsmbstu: 我想问题是出在 ri = cbind(data31[,1],data31[,i+1]) 01/07 12:54
22F:→ clsmbstu: R会以为你要把每次cbind的结果都存到叫"ri"的东西 01/07 12:55
23F:→ clsmbstu: assign(paste0("r",i),cbind(data31[,1],data31[,i+1])) 01/07 12:58
24F:→ clsmbstu: 这样写才会每次把结果存进不同的variable 之後才能操弄 01/07 12:59
25F:→ clsmbstu: 不过等你学会lapply等function以後 应该会更喜欢把这些 01/07 12:59
26F:→ clsmbstu: 类似格式的资料(例如rXX)全部整理进一个list 更方便 01/07 13:00
27F:→ askpeople: 之後我想把产生的r1,...r22合并 尝试用以下写法: 01/10 12:14
28F:→ askpeople: r = paste0("r",1:22) 然後lapply(r, rbind) 01/10 12:14
29F:→ askpeople: 现在是希望把r1..r22塞到cbind里面,可想不出好的方式 01/10 12:16
30F:→ askpeople: 我自己已经用melt处理过,但想增强写回圈的能力 (Orz) 01/10 12:16
31F:→ celestialgod: 能不用回圈就不要用回圈... 01/10 18:33
32F:→ celestialgod: 而且你好像没分清楚变数名称跟字串差异= = 01/10 18:33
33F:→ askpeople: 我用paste0这样,发现变成字串"r1"..所以不知道怎麽办 01/11 09:31
34F:→ askpeople: 而assign我了解了一下,知道是给变数一个数值 01/11 09:33