楼主: fuyizhou
9033 9

[问答] 已知两个数据框,如何用r语言完成一些计算?急求急求急求!!! [推广有奖]

  • 1关注
  • 0粉丝

高中生

2%

还不是VIP/贵宾

-

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

楼主
fuyizhou 发表于 2014-12-30 02:32:58 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
如下两个数据框
> recommendation
   user item  val
1     1  104 30.5
2     1  105 12.5
3     1  106  7.5
4     2  105 13.0
5     2  106  9.0
6     3  103 24.5
7     3  106 10.5
8     3  102  8.0
9     4  105 22.0
10    4  102 20.5
11    4  106 12.5
12    5  102 16.0
> testing
   user item pref
11    3  107    5
15    4  106    4
17    5  102    3


现在要利用这两个数据框进行数据分析:
precision=推荐正确率 就是说  3  107 在recommendation中没有推荐 则0/3 (3是向user=3的用户推荐的item 数)
                                         4  106 在recommendation中有推荐 1/3
                                         5  102 在recommendation中有推荐1/1
                                        (4/3)/3(和除以测试用户数)=4/9
recall=喜好正确率 就是说 0+1(对于用户4来说,只喜欢106,也推荐了106,所以是1)+1(对于用户5来说,102同理)=2
                          2/3(和除以测试用户数)即r值
那么,请问这种怎么用r语言写出来,因为可能涉及循环(需要验证testing中的user、item是否属于recommendation),并不是特别懂,特来询问,望回复解答,非常感谢!
[precision&recall已经解决 非常感谢高手解答!]

还有一个问题求助:
还有一个值auc
auc=(testing在recommendation的序列/用户推荐长度)/测试用户总数
比如 3 107没有推荐 就是 0
       4 106 排第三个 就是 3/3
       5 102 排第一个 就是 1/1
然后加起来除以testing总数 这个序列又如何操作?
用一楼的大神代码:
each_precision =sapply(unique(m[,1]),function(x) nrow(subset(m,m[,1]==x&m[,2]==m[,4]))/sum(m[,1]==x))

#nrow是行数 所以只需要将行数 改成在m中的user索引序列
但是索引这边总出问题 还请高手回复
谢谢谢谢!

二维码

扫码加我 拉你入群

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

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

关键词:如何用 数据框 R语言 Recommend PRECISION 如何

沙发
yywan0913 在职认证  发表于 2014-12-30 09:28:04
  1. recommendation=data.frame(user=c(1,1,1,2,2,3,3,3,4,4,4,5),item=c(104,105,106,105,106,103,106,102,105,102,106,102),val=rnorm(12))
  2. testing=data.frame(user=3:5,item=c(107,106,102),pref=5:3)
  3. library(reshape2)
  4. m=merge(recommendation,testing,by=c("user"))
  5. each_precision=sapply(unique(m[,1]),function(x) nrow(subset(m,m[,1]==x&m[,2]==m[,4]))/sum(m[,1]==x))
  6. precision=sum(each_precision)/length(unique(m[,1]))
复制代码
each_precision那一句应该可以借助melt后的功能更好得到,或者data.table包,我用的不熟

藤椅
yywan0913 在职认证  发表于 2014-12-30 09:34:09
  1. m2=merge(recommendation,testing,by=c("user","item"))
  2. recall=nrow(m2)/nrow(testing)
复制代码

m2即是测试与推荐达到吻合的地方
已有 1 人评分经验 收起 理由
李会超 + 40 热心帮助其他会员

总评分: 经验 + 40   查看全部评分

板凳
jiangbeilu 学生认证  发表于 2014-12-30 10:20:07
我觉得是可以通过merge函数来实现precision的计算的,因为你按照user and item合并后,设置all=TRUE,并且先在testing的数据集添加一列全部为1的常数量,合并后,只需要对这一列加总就可以看出有多少是匹配的了。
主要是楼主给的数据太少,我这种做法适合你给同一个user推荐多种商品的时候计算的。

再结合tapply和length函数,计算出每一个user推荐的产品数,就可以算precision了。

报纸
李会超 发表于 2014-12-30 10:36:48
  1. 首先借用一楼哥们的数据
  2. > recommendation=data.frame(user=c(1,1,1,2,2,3,3,3,4,4,4,5),item=c(104,105,106,105,106,103,106,102,105,102,106,102),val=rnorm(12))
  3. > testing=data.frame(user=3:5,item=c(107,106,102),pref=5:3)
  4. 然后开始长途的分析
  5. a<-merge(testing,recommendation,by=c("user","item"),all.x=TRUE)
  6. b<-table(recommendation$user)
  7. d<-as.data.frame(b)
  8. e<-merge(a,d,by.x='user',by.y='Var1',all.x=TRUE)
  9. e$val<-ifelse(is.na(e$val),0,1)
  10. 得到e的结果如下
  11.   user item pref val Freq
  12. 1    3  107    5   0    3
  13. 2    4  106    4   1    3
  14. 3    5  102    3   1    1
  15. val表示推荐的是否正确,Freq表示向user的推荐总次数
  16. val/Freq就是推荐正确率
  17. sum(e$val)/nrow(e)就是喜好率
复制代码

地板
dataorz 发表于 2014-12-30 10:59:28
flg <- 1
recommendation <- data.frame(recommendation,flg)
flg <- 0
testing <- data.frame(testing,flg)
usercount <- data.frame(with(recommendation,table(user)))
recommendation1 <- rbind(recommendation[,c("user","item","flg")],testing[,c("user","item","flg")])
preList <- aggregate(recommendation1,by=list(recommendation1$user,recommendation1$item),FUN=sum)
pre <- merge(testing,preList,by.x=c("user","item"),by.y=c("Group.1","Group.2"))[,c(1,2,7)]
precision <- merge(pre,usercount)
precision <-  data.frame(precision,preci=precision$flg.y/precision$Freq)
precision[,c(1,2,5)]
已有 1 人评分论坛币 收起 理由
admin_kefu + 40 精彩帖子

总评分: 论坛币 + 40   查看全部评分

7
fuyizhou 发表于 2015-1-5 02:17:29
yywan0913 发表于 2014-12-30 09:34
m2即是测试与推荐达到吻合的地方
非常非常感谢!
还有一个问题求助:
还有一个值auc
auc=(testing在recommendation的序列/用户推荐长度)/测试用户总数
比如 3 107没有推荐 就是 0
       4 106 排第三个 就是 3/3
       5 102 排第一个 就是 1/1
然后加起来除以testing总数 这个序列又如何操作?

8
fuyizhou 发表于 2015-1-5 02:30:30
yywan0913 发表于 2014-12-30 09:34
m2即是测试与推荐达到吻合的地方
each_precision =sapply(unique(m[,1]),function(x) nrow(subset(m,m[,1]==x&m[,2]==m[,4]))/sum(m[,1]==x))

#nrow是行数 所以只需要将行数 改成在m中的user索引序列
但是索引这边总出问题 还请高手回复
谢谢谢谢!

9
fuyizhou 发表于 2015-1-5 11:52:34
dataorz 发表于 2014-12-30 10:59
flg
非常非常感谢!

10
fuyizhou 发表于 2015-1-5 11:53:40
jiangbeilu 发表于 2014-12-30 10:20
我觉得是可以通过merge函数来实现precision的计算的,因为你按照user and item合并后,设置all=TRUE,并且先 ...
谢谢谢谢!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 19:09