首页 > 解决方案 > R DataFrame 通过行集合快速操作

问题描述

我在 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       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”:) 来实现这一点。

谢谢。

标签: r

解决方案


我们可以ave从基础 R使用

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]

推荐阅读