楼主: xiaowenjie21
998 7

[问答] 一个关于矩阵方面的问题,请帮帮忙 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

初中生

19%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
78 点
帖子
9
精华
0
在线时间
10 小时
注册时间
2015-1-15
最后登录
2017-8-1

楼主
xiaowenjie21 发表于 2016-6-15 09:53:06 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
顾客1 菜品1,菜品2 数量1份,数量2份
顾客2  菜品1,菜品2,菜品3 数量1份,数量2份,数量3份
顾客3  菜品1,菜品2,菜品3 数量1份,数量2份,数量3份
顾客4  菜品1,菜品2,菜品3 数量1份,数量2份,数量3份
顾客5  菜品1,菜品2 数量1份,数量2份





大概是这样的数据,需要将菜品,数量分裂出来到下一行,然后顾客1对应菜品1
顾客1对应菜品2,这样子形成一行行数据

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:如何

沙发
xiaowenjie21 发表于 2016-6-15 09:56:31
然后希望得出的结果是这样的
顾客1 菜品1 数量1份
  顾客1 菜品2  数量2份
   顾客1  菜品3   数量3份
顾客2 菜品1  数量1份


藤椅
jiangbeilu 学生认证  发表于 2016-6-15 17:54:36
如果你的数据就这样,是规则的,那么可以用以下代码来实现:
  1. x <- 1:5
  2. y <- c("1,2","1,2,3","1,2,3","1,2,3","1,2")
  3. z <- c("a,b","a,b,c","a,b,c","a,b,c","a,b")
  4. or_df <- data.frame(x,y,z,stringAsFactors=FALSE)

  5. tranfun <- function(id,value){
  6. rawdata <- split(as.character(value),id)
  7. rawdata2 <- lapply(rawdata,function(x) unlist(strsplit(x,",")))
  8. repnum <- unlist(sapply(rawdata2,length))
  9. customer <- unlist(mapply(rep,id,repnum))
  10. caipin <- as.vector(unlist(rawdata2))
  11. return(data.frame(customer,caipin))
  12. }
  13. # 这里运行之后,需要改一下最后一列的名字
  14. cbind(tranfun(x,y),tranfun(x,z)[,2])
复制代码

板凳
jiangbeilu 学生认证  发表于 2016-6-15 17:58:36
如果有更好的方式,欢迎指出哈。这里只是用最原始的方式来处理的。

报纸
马甲1号 发表于 2016-6-16 09:24:33
沿用楼上的数据生成部分,给一个奇巧淫技点的实现方法:

  1. x <- 1:5
  2. y <- c("1,2","1,2,3","1,2,3","1,2,3","1,2")
  3. z <- c("a,b","a,b,c","a,b,c","a,b,c","a,b")
  4. or_df <- data.frame(x,y,z)

  5. with(or_df,{
  6.   exp= sprintf('data.frame(custom=%s, quantity=c(%s), item=c("%s"))',x,y,gsub(',','","',x ))
  7.   Reduce(rbind, lapply(exp, function(x) eval(parse(text=x))))
  8. })
复制代码

地板
xiaowenjie21 发表于 2016-6-16 10:59:50
楼上的大神好,其实我用了一段代码实现,但是效率太慢哎,10w数据分解,要花好几十分钟
  1. mydata_list<-1:nrow(mydata)
  2. class(mydata_list)

  3. rbin_df<-data.frame(stringsAsFactors = FALSE,'1','2','3','4','5')

  4. for(x in mydata_list){
  5.   
  6.   rbin_food_name<-unlist(str_split(mydata[x,]$food_name,','))
  7.   rbin_food_count<-unlist(str_split(mydata[x,]$food_count,','))
  8.   
  9.   for(m in 1:length(rbin_food_name)){
  10.    
  11.     add_rows<-c(id=mydata[x,]$order_id,address=mydata[x,]$address,username=mydata[x,]$username,foodname=rbin_food_name[m]
  12.                 ,foodcount=rbin_food_count[m])
  13.     print(add_rows)
  14.     print(class(add_rows))
  15.     rbin_df<-rbind(rbin_df,add_rows)
  16.   }
  17. }
复制代码

7
xiaowenjie21 发表于 2016-6-16 11:10:50
马甲1号 发表于 2016-6-16 09:24
沿用楼上的数据生成部分,给一个奇巧淫技点的实现方法:
这个方法很强大啊,但是代码看不懂

8
马甲1号 发表于 2016-6-16 15:13:48
xiaowenjie21 发表于 2016-6-16 11:10
这个方法很强大啊,但是代码看不懂
就是对每个id生成一个data.frame赋值语句,批量eval成data.frame,再用rbind拼装起来。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 13:27