私はdata.frame
ID code
A 1
A 1
A 2
A 1
B 4
B 1
B 1
C 2
C 3
C 3
C 2
削除の方法は知っていますが、頻度を計算する必要があります。
ID code freq
A 1 3
A 2 1
B 4 1
B 1 2
C 2 2
C 3 2
私はdata.frame
ID code
A 1
A 1
A 2
A 1
B 4
B 1
B 1
C 2
C 3
C 3
C 2
削除の方法は知っていますが、頻度を計算する必要があります。
ID code freq
A 1 3
A 2 1
B 4 1
B 1 2
C 2 2
C 3 2
いくつかの方法があります。を使用したものを次に示しますave
。
unique(within(mydf, {
Freq <- ave(code, ID, code, FUN = length)
}))
# ID code Freq
# 1 A 1 3
# 3 A 2 1
# 5 B 4 1
# 6 B 1 2
# 8 C 2 2
# 9 C 3 2
または、別のオプション (ただし、行の順序は異なります):
X <- data.frame(table(mydf))
X[X$Freq != 0, ]
# ID code Freq
# 1 A 1 3
# 2 B 1 2
# 4 A 2 1
# 6 C 2 2
# 9 C 3 2
# 11 B 4 1
パッケージを使用する場合 (この回答の他の 2 つのオプションはベース R を使用します)、特にデータが大きい場合は、「data.table」を確認する必要があります。
library(data.table)
DT <- data.table(mydf)
DT[, .N, by = c("ID", "code")]
# ID code N
# 1: A 1 3
# 2: A 2 1
# 3: B 4 1
# 4: B 1 2
# 5: C 2 2
# 6: C 3 2
オプションがどのようにスケーリングするかを確認するために、より大きなデータセットのベンチマークを次に示します。
library(microbenchmark)
library(data.table)
いくつかのデータを作成します。
set.seed(1)
mydf <- data.frame(ID = sample(LETTERS, 100000, replace = TRUE),
code = sample(1:10, 100000, replace = TRUE))
DT <- data.table(mydf)
機能を確立します。
AM1 <- function() {
X <- data.frame(table(mydf))
X[X$Freq != 0, ]
}
AM2 <- function() {
unique(within(mydf, {
Freq <- ave(code, ID, code, FUN = length)
}))
}
AM3 <- function() {
DT[, .N, by = c("ID", "code")]
}
DDP <- function() {
ddply(mydf, .(ID, code), nrow)
}
基準:
microbenchmark(AM1(), AM2(), AM3(), DDP(), times=100)
# Unit: milliseconds
# expr min lq median uq max neval
# AM1() 65.64750 66.92666 68.86916 70.25277 137.12961 100
# AM2() 224.85660 228.05091 230.02311 232.77116 295.55184 100
# AM3() 11.15789 11.30541 11.44706 11.72064 77.72398 100
# DDP() 97.75484 100.86891 103.42602 106.85045 171.02863 100
小さなデータセット (試してみることができます) ではAM2()
、最速のはずですが、上記の結果に見られるように、うまくスケーリングできません。AM3()
ただし、(「data.table」オプション)は、より大きなデータセットでは困難になります。
パッケージddply
からご利用ください。plyr
library(plyr)
dfDuplicates = as.data.frame(read.table(textConnection("ID code
A 1
A 1
A 2
A 1
B 4
B 1
B 1
C 2
C 3
C 3
C 2"), header = TRUE))
ddply(dfDuplicates, .(ID, code), nrow)