Câu trả lời được cung cấp bởi rcs hoạt động và rất đơn giản. Tuy nhiên, nếu bạn đang xử lý các bộ dữ liệu lớn hơn và cần tăng hiệu suất, có một cách khác nhanh hơn:
library(data.table)
data = data.table(Category=c("First","First","First","Second","Third", "Third", "Second"),
Frequency=c(10,15,5,2,14,20,3))
data[, sum(Frequency), by = Category]
# Category V1
# 1: First 30
# 2: Second 5
# 3: Third 34
system.time(data[, sum(Frequency), by = Category] )
# user system elapsed
# 0.008 0.001 0.009
Hãy so sánh điều đó với cùng một thứ bằng cách sử dụng data.frame và ở trên:
data = data.frame(Category=c("First","First","First","Second","Third", "Third", "Second"),
Frequency=c(10,15,5,2,14,20,3))
system.time(aggregate(data$Frequency, by=list(Category=data$Category), FUN=sum))
# user system elapsed
# 0.008 0.000 0.015
Và nếu bạn muốn giữ cột thì đây là cú pháp:
data[,list(Frequency=sum(Frequency)),by=Category]
# Category Frequency
# 1: First 30
# 2: Second 5
# 3: Third 34
Sự khác biệt sẽ trở nên đáng chú ý hơn với các bộ dữ liệu lớn hơn, vì đoạn mã dưới đây thể hiện:
data = data.table(Category=rep(c("First", "Second", "Third"), 100000),
Frequency=rnorm(100000))
system.time( data[,sum(Frequency),by=Category] )
# user system elapsed
# 0.055 0.004 0.059
data = data.frame(Category=rep(c("First", "Second", "Third"), 100000),
Frequency=rnorm(100000))
system.time( aggregate(data$Frequency, by=list(Category=data$Category), FUN=sum) )
# user system elapsed
# 0.287 0.010 0.296
Đối với nhiều tập hợp, bạn có thể kết hợp lapply
và .SD
như sau
data[, lapply(.SD, sum), by = Category]
# Category Frequency
# 1: First 30
# 2: Second 5
# 3: Third 34
rowsum
.