问题是新列需要重复其值一定次数。数据如下所示,但重复数十万行:
数据框:评分
**USER#** **ITEM#** **Rating**
USER1 ITEM1 ....3
USER1 ITEM2 ....2
USER1 ITEM3 ....4
USER2 ITEM1 ....1
USER2 ITEM2 ....2
USER2 ITEM3 ....5
我想添加一个列,每个用户的每个行的平均值都是平均值,所以它会如下所示:
**USER#** **ITEM#** **Rating** **UserMean**
USER1 ITEM1 ....3 ...... 3
USER1 ITEM2 ....2 ...... 3
USER1 ITEM3 ....4 ...... 3
USER2 ITEM1 ....1 ......2.67
USER2 ITEM2 ....2 ...... 2.67
USER2 ITEM3 ....5 ...... 2.67
我知道如何使用以下内容获取所有用户手段:
UserMean<-tapply(Ratings$Rating,list(Ratings$User),mean)
这给了每个用户的平均值,我希望每行显示该用户的平均评分,但是当我使用时它不起作用:
Ratings$UserMean<-UserMean # or the above tapply function
我怎样才能实现目标?我知道如何创建一个数组,显示每个用户投票的次数。我可以用某种方式使用那个数组吗?
由于
答案 0 :(得分:2)
你很近,你只需要ave()
功能。试试
Ratings<-data.frame(
User=rep(1:2, each=3),
Item=rep(letters[1:3], 2),
Rating=c(3,2,4,1,2,5)
)
UserMean <- ave(Ratings$Rating, Ratings$User, FUN=mean)
ave()
函数将计算您指定的每个级别的值,然后按照级别的原始顺序保留该值。在很多情况下,它基本上类似于tapply
,但它不会折叠值。它还可以为因子的每个级别返回不同的值。例如
ReviewNum <- ave(Ratings$Rating, Ratings$User, FUN=seq_along)
可以跟踪每个用户的评论编号。
答案 1 :(得分:2)
你应该使用ave
(就像在其他答案中提到的那样,我包含了我的答案,因为我花了很多时间来润色你的数据)。
dat <- read.table(text='USER ITEM Rating
USER1 ITEM1 3
USER1 ITEM2 2
USER1 ITEM3 4
USER2 ITEM1 1
USER2 ITEM2 2
USER2 ITEM3 5',header=TRUE)
dat$UserMean <- ave(dat$Rating,dat$USER)
USER ITEM Rating UserMean
1 USER1 ITEM1 3 3.000000
2 USER1 ITEM2 2 3.000000
3 USER1 ITEM3 4 3.000000
4 USER2 ITEM1 1 2.666667
5 USER2 ITEM2 2 2.666667
6 USER2 ITEM3 5 2.666667
另一种选择是使用plyr
:
library(plyr)
ddply(dat,.(USER),transform,userMean= mean(Rating))
答案 2 :(得分:2)
data.table
解决方案
library(data.table)
setDT(dat)[, UserMean := mean(Rating), by = USER]
dat
或者基本R功能的使用效率低于上面提出的
merge(dat, aggregate(Rating ~ USER, dat, mean), by = "USER")
答案 3 :(得分:1)
另一种选择是使用dplyr:
require(dplyr)
Ratings <- Ratings %.% group_by(USER) %.% mutate(UserMean = mean(Rating))
# USER ITEM Rating UserMean
#1 USER1 ITEM1 3 3.000000
#2 USER1 ITEM2 2 3.000000
#3 USER1 ITEM3 4 3.000000
#4 USER2 ITEM1 1 2.666667
#5 USER2 ITEM2 2 2.666667
#6 USER2 ITEM3 5 2.666667