我在R中有一个数据框,它的前几行看起来像这样:
User_Name Product Score
John 1 1.5
John 2 0.5
John 3 0.1
Tim 1 2
Tim 2 2
Tim 3 1
我要尝试的是针对每个User_Name,通过除以该用户的最高得分来“标准化”产品得分。即,我会得到:
User_Name Product Score
John 1 1
John 2 0.333
John 3 0.0667
Tim 1 1
Tim 2 1
Tim 3 0.5
到目前为止,我已经使用for循环完成此操作,并为每个唯一用户设置了数据框,然后使用rbind()将所有结果附加到新的数据框。但是,随着我的数据帧变得非常大,这似乎将花费太长时间。我想知道是否有更快的“ R-way” :)来完成此任务。
谢谢。
答案 0 :(得分:2)
我们可以在底数R中使用ave
df$Score1 <- with(df, Score/ave(Score, User_Name, FUN = max))
df
# User_Name Product Score Score1
#1 John 1 1.5 1.0000
#2 John 2 0.5 0.3333
#3 John 3 0.1 0.0667
#4 Tim 1 2.0 1.0000
#5 Tim 2 2.0 1.0000
#6 Tim 3 1.0 0.5000
或与dplyr
library(dplyr)
df %>% group_by(User_Name) %>% mutate(Score = Score/max(Score))
为了完整性data.table
library(data.table)
setDT(df)[, Score1 := Score/max(Score), by = User_Name]