【发布时间】:2016-11-28 10:44:34
【问题描述】:
我的代码正在运行,但非常非常缓慢。所以这是一个大问题,它必须运行得更快。所以这里是任务: 我有一个包含电信记录的数据集,我想对每个客户的所有记录应用多种功能,并将结果放入另一个数据框中。
所以df1 是数据框,其中每一行都有一个唯一的客户 ID 和带有一些配置文件信息的列。 df2 是一个非常大的数据框,其中包含通过客户 ID 识别的大约 800 000 条电信记录。现在我想计算例如df2 中每个客户的平均数据使用量,并将结果保存在 df1 中。
df1 看起来像
df1 <- read.table(header = TRUE, sep=",",
text="CUSTOMER_ID,Age,ContractType, Gender
ID1,45,Postpaid,m
ID2,50,Postpaid,f
ID3,35,Postpaid,f
ID4,44,Postpaid,m
ID5,32,Postpaid,m
ID6,48,Postpaid,f
ID7,50,Postpaid,m
ID8,51,Postpaid,f")
df2 看起来像
df2 <- read.table(header = TRUE, sep=",",
text="CUSTOMER_ID,EVENT,VOLUME, DURATION, MONTH
ID1,100,500,200,201505
ID1,50,400,150,201506
ID1,80,600,50,201507
ID2,40,800,45,201505
ID2,25,650,120,201506
ID2,65,380,250,201507
ID3,30,950,110,201505
ID3,25,630,85,201506
ID3,15,780,60,201507")
我的代码是这样的
USAGE <- c("EVENT", "VOLUME", "DURATION") #column names of df2
我想在df2上应用的函数列表
StatFunctions <- list(
max = function(x) max(x),
mean = function(x) mean(x),
sum = function(x) sum(x)
)
在我的原始数据集中,客户 ID 更复杂,因此我选择此模式搜索切割者 ID。这只是我的代码的一部分。但其余的问题与 for 循环相同。
func.num <- function(prefix, target.df, n) {
active.df <- get(target.df)
return(StatFunctions[[n]](active.df[grep(pattern = prefix,
x = active.df$CUSTOMER_ID), USAGE[m]]))
}
for (x in df1$CUSTOMER_ID) {
for (m in 1:length(USAGE)) {
for (n in 1:length(StatFunctions)) {
df1[df1$CUSTOMER_ID == x, paste(names(StatFunctions[n]),
USAGE[m], sep = "_")] <- func.num(prefix = x, target.df = "df2",n)
}
}
}
我知道代码很复杂,应该简化一下。
我想要一个这样的数据框
Customer_ID Age contractType Gender max_EVENT mean_EVENT sum_EVENT ... sum_DURATION
ID1 45 Postpaid m 100 76 230 ... 400
那么我怎样才能避免 for 循环运行得更快呢?
【问题讨论】:
-
您可能对 Code Review 感兴趣,这是另一个 Stack Exchange 网站,用于审查已经运行的代码
-
apply 及其衍生产品(mapply、sapply、tapply、...)可能会有所帮助。尝试使用这些函数并比较执行持续时间。