【发布时间】:2018-07-14 17:21:54
【问题描述】:
我想知道这个循环是否可以加速,我想知道你是否可以帮助我解决这个问题。
我已经使用了所有的技巧,但我仍然认为这还不够。
问题在于从下一年的 df 中减去一年 df 的金额。我有 2 个数据框:
df_2016 <- data.frame(
subject = rep(1:195, 65*39),
items = rep(1:39, 195*65),
sub_items = rep(1:65, 195*39),
value = sample(1:100000000,(195*65*39)),
period = rep("2016",(195*65*39)))
df_2016 <- df_2016[sample(1:(195*65*39),450000),] # See Reference "A" below
df_2017 <- data.frame(
subject = rep(1:195, 65*39),
items = rep(1:39, 195*65),
sub_items = rep(1:65, 195*39),
value = sample(1:100000000,(195*65*39)),
period = rep("2017",(195*65*39)))
简而言之,有 3 个分类变量和 1 个数字变量。一个数据集包含 2016 年的数据,另一个数据集包含 2017 年的数据。
我想从 2017 年的金额中减去 2016 年的金额,相同的“主题”和相同的“项目”和相同的“子项目”。 (参考 A)没有重复的行,但可能会发生 2017 年的一行没有 2016 年的对;如果它有它的一对,它只有一个。
我用“级联子集”制作了这个函数,它确实加速了我的函数,但还不够:
Func_diff <- function (df_per = df_2017, df_it = df_2016){
func_df <<- df_per[1,1:5] # i create the df where i'm going to put the outputs
y <- 1
subject_v <- sort(unique(df_per$subject))
# 0 # Loop over subject
for (j in 1:length(subject_v)) {
df_per_w <- df_per[df_per$subject == subject_v[j], ]
df_it_w <- df_it[df_it$subject == subject_v[j], ]
item_v <- sort(unique(df_per_w$items))
# 2 # . Loop1 over items
for (w in 1:length(item_v)){
sub_item_v <- sort(unique(df_per_w[df_per_w$items == item_v[w], 3]))
# 3 # Loop over subitems
for(z in 1:length(sub_item_v)){
dfcara_per <- df_per_w[df_per_w$items == item_v[w] & df_per_w$sub_items == sub_item_v[z],]
dfcara_it <- df_it_w[df_it_w$items == item_v[w] & df_it_w$sub_items == sub_item_v[z],]
# 4 # Loop over selected rows: subject[j], items[w], sub_items[z]
for (i in 1:nrow(dfcara_per)) {
# Checks if that combination of subject, item and subitem, existed the year before:
if(length(dfcara_it[dfcara_it$subject == dfcara_per[i,1] &
dfcara_it$items == dfcara_per[i,2] &
dfcara_it$sub_items == dfcara_per[i,3], 4]) != 0) {
func_df[y,1:5] <<- c(
dfcara_per[i,1:3],
sum(dfcara_per[i,4] -
dfcara_it[
dfcara_it$subject == dfcara_per[i,1] &
dfcara_it$items == dfcara_per[i,2] &
dfcara_it$sub_items == dfcara_per[i,3],
4]),
dfcara_per[i,5]
)
}else{
func_df[y,1:5] <<- func_df[i,1:5] # If there is no data in 2016, the function saves the amount of 2017
}
y <- y + 1
}
}
}
}
} # Function . End
它可以工作,但它需要很长时间,我不明白为什么一个简单的操作需要这么长时间。
提前感谢您!
【问题讨论】:
-
只需合并两个数据框并跨列运行所需的计算。
-
提示:当你想到速度的时候想到 data.table,注意发布结果以便我可以确定最终输出?
标签: r performance loops