1

したがって、id、count、username の列を保持するデータフレームの例があり、id と count は数値で、username は文字列です。

データフレームのすべての行に対して、「比率」と呼ばれる新しい列の値を設定したいと思います。比率は次のように定義されます

カウント / 行数 ここで、ユーザー名 == この行のユーザー名

提供されたデータの例:
ユーザー名が 'Tom' であるすべての行で、比率は count/4 になります。これは、ユーザー Tom がデータ内で 4 回検出されるためです。

これは私の問題の単純化されたバージョンにすぎません。元のデータフレームには約 340 万行あり、for ループを使用して「username」などの一意の値を反復処理してこれを解決した以前のアプローチであるため、for ループはオプションではありません。問題は永遠にかかります。

私のデータフレームの出力:

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")

問題を理解して再現するためにすべてを提供したことを願っています。何か不足している場合は、遠慮なくコメントで言及してください。

4

2 に答える 2

7

いくつかのオプションがあります。ここに 3 つあり、1 つはベース R、1 つはdata.table、もう 1 つは "plyr" です。どちらも、「mydf」という名前の data.frame から開始していると想定しています。

ベース R

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

データ表

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

プライヤー

library(plyr)
ddply(mydf, .(usernames), transform,
      ratio = count/length(usernames))
于 2013-03-21T18:41:44.227 に答える
3

これに使用できますave

transform(d, x=count/as.numeric(ave(d$usernames, d$usernames, FUN=length)))
于 2013-03-21T18:41:37.333 に答える