作者shirley7483 (Shirley)
看板R_Language
标题[问题] 平均分布分割测试与训练资料
时间Wed Jun 21 17:43:40 2017
[问题类型]:
程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
[软体熟悉度]:
入门(写过其他程式,只是对语法不熟悉)
[问题叙述]:
透过logit model,用各个商品的属性及是否阅读商品评论,预测消费者会购买哪种商品
为了实作predit()要分割资料集
已知caret package的createDataPartition能将训练与测试集的商品依比例平均分布
但资料集为long format,每四列为一个单位(一个受测者产生四列资料,为四个商品)
使用createDataPartition後,资料被打散了,不再是每四列为一单位
该如何保持资料每四列一个单位,但训练与测试集中的商品还是可以按比例分布呢?
ps被购买的商品比例本来就不平均,但希望训练集与测试集的比例相同,例如10:5:2:1
[程式范例]:
共有432名受测者,1728列资料,long format资料集如图
http://imgur.com/pWhvNCF
各商品被购买的比例大约为
HighJ HighU LowJ LowU
272 80 60 20
library(caret)
Train <- createDataPartition(mydata$purchase, p=0.6, list=FALSE)
training <- mydata[ Train, ]
testing <- mydata[ -Train, ]
照上述程式码跑无错误讯息,但是资料被打散
推测可能是用来取index的mydate$purchase有问题,不知道该怎麽改才好@@
[环境叙述]:
R version: 3.2.3 (2015-12-10)
Platform: x86_64-w64-mingw32
Running under: Windows >= 10
[关键字]:
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.240.104.195
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1498038223.A.AC3.html
1F:推 f496328mm: 有id就好办了,去sample,然後 %in% 就可以抓出来了 06/21 18:06
2F:推 f496328mm: sample(nrow(data)/4,train.amount) 06/21 18:08
3F:→ f496328mm: 上面是取 train 的 id,之後去抓相同的id即可 06/21 18:09
4F:推 f496328mm: data[ subject_id %in% train_id ] 06/21 18:11
感谢回覆!我试做之後好像有点错误,可以指正一下吗>"<
# 解读为从1728笔中,取出260个数字当作train_id
sample(nrow(mydata)/4, 260)
newdata <- mydata[ "subject_id" %in% "train_id" ]
不太确定%in%的用法,google一直忽略%所以查不到......
所以第二行还不太理解,直接照打後发现如果不加 " " 会出现下述错误
Error in match(x, table, nomatch = 0L) : object 'subject_id' not found
没有error顺利跑完後,newdata有1728obs. of 0 variables
请问有哪里做错了吗QAQ
※ 编辑: shirley7483 (111.240.104.195), 06/21/2017 18:35:13
5F:→ obarisk: 我们的google不一样? 06/21 18:54
7F:→ obarisk: 8&oe=utf-8&gws_rd=cr&ei=RFBKWYHnJ4S20ATg3oz4BQ 06/21 18:54
9F:→ obarisk: 我贴网址的能力有问题 06/21 18:57
11F:→ obarisk: -operator 06/21 18:57
12F:→ obarisk: ?`%in%` 06/21 18:58
抱歉我估狗%in% r,出现一堆XXX in R的资料,原来放前後顺序搜寻有差,学到了!
也感谢提醒?`%in%`,原来符号前後面要加`,难怪我一直出现error...
重新理解後做了修正,感觉很接近需求了,只是这次又出现一些问题
train_id <- sample(nrow(mydata)/4,260, replace = FALSE)
length(train_id)
#确定真的有取出260个数字做为train_id
mydata$train <- mydata$subject_id %in% train_id
#新增栏位放比对後的True/False
traindata <- mydata[mydata$train == TRUE, ]
#有train==TRUE那列放到新dataframe
正常来说,traindata应该要有260*4=1040笔
但traindata只有900多笔,而且每次做数量都不同...好困惑啊
再麻烦各位协助了>"<
※ 编辑: shirley7483 (111.240.104.195), 06/21/2017 19:55:27
※ 编辑: shirley7483 (111.240.104.195), 06/21/2017 20:00:48
抱歉!!!
上述程式没有问题,能够成功取出1040笔资料
是我原始资料中的编号出错,改正後已解决
感谢各位的协助,让我成功可以继续下一步 m(_ _)m
※ 编辑: shirley7483 (111.240.104.195), 06/21/2017 20:20:07
13F:→ f496328mm: mydata[ "subject_id" %in% "train_id" ] 把引号拿掉 06/21 22:24
14F:→ f496328mm: 如果会有error 那把mydata转成data.table型态 06/21 22:30
15F:→ shirley7483: 成功!使用data.table好快速啊,马上笔记起来,感谢~ 06/22 08:33
※ 编辑: shirley7483 (111.240.104.195), 06/22/2017 08:34:06
16F:→ celestialgod: 楼楼上只是少一个,所以才出错 06/22 20:07
17F:→ f496328mm: 原来不是引号的问题QQ 06/22 20:32
18F:→ celestialgod: data.table可以不用,,但data.frame, matrix一定要 06/22 20:36