使用数据框中列值的频率来计算新的列值

  • 本文关键字:计算 频率 数据 vector dataframe
  • 更新时间 :
  • 英文 :


所以我有一个示例数据框架,其中包含列id, count和username, id和count是数字,username是字符串。

对于数据框的每一行,我想设置一个名为"ratio"的新列的值,其中ratio被定义为

count/本行中username ==用户名的行数

所提供数据中的示例:
在用户名为"Tom"的每一行中,比率将为count/4,因为用户Tom在数据中被发现了四次。

这只是我的问题的简化版本,for循环不是一个选项,因为我的原始数据框架有大约340万行,我以前的方法,我使用for循环迭代的唯一值,例如。'username'永远解决不了这个问题。

my dataframe:

structure(list(id = 1:20, count = c(140L, 89L, 17L, 114L, 129L, 
86L, 21L, 50L, 197L, 160L, 8L, 14L, 78L, 208L, 155L, 55L, 63L, 
20L, 189L, 79L), usernames = structure(c(4L, 3L, 5L, 5L, 2L, 
3L, 1L, 1L, 3L, 1L, 3L, 2L, 5L, 5L, 4L, 4L, 2L, 2L, 2L, 3L), .Label = c("Jerry", 
"Mark", "Phil", "Tina", "Tom"), class = "factor")), .Names = c("id", 
"count", "usernames"), row.names = c(NA, 20L), class = "data.frame")

我希望我提供了所有的东西让你理解和重现这个问题,如果有什么遗漏的,请在评论中提到。

有几个选项。这里有三个,一个是碱基R,一个是data.table,还有一个是"plyr"。两者都假设我们从一个名为"mydf"的data.frame开始:

基地R

within(mydf, {
  temp <- as.numeric(ave(as.character(usernames), usernames, FUN = length))
  ratio <- count/temp
  rm(temp)
})

data.table

library(data.table)
DT <- data.table(mydf)
DT[, ratio := count/.N, by = "usernames"]
DT

plyr

library(plyr)
ddply(mydf, .(usernames), transform,
      ratio = count/length(usernames))

您可以使用ave:

transform(d, x=count/as.numeric(ave(d$usernames, d$usernames, FUN=length)))