gpt4 book ai didi

r - 在 R 中逐行构建复杂数据帧的有效方法

转载 作者:行者123 更新时间:2023-12-02 09:00:11 24 4
gpt4 key购买 nike

:)大家好

是的,我知道已经有一些提示和技巧如何有效地逐行构建数据帧,但我的 for 循环仍然很慢。也许对于你们中的一个人来说,如何加快速度/它这么慢的原因是什么是显而易见的。

如您所见,我已经按照以下说明将其转换为列表:Creating an R dataframe row-by-row但这并没有使它比 rbind 快得多。

index = 1

for (i in 1:nrow(predictionDf)) {

startDate = predictionDf$ApropYMD[i]
amountPerMonth = (predictionDf$PredictionExp[i]/12)
amountPerMonthMax = (predictionDf$PredictionMax[i]/12)

print(i)

for (j in 1:12) {

plotDf[index, ] = list(ApropYMD=startDate, AmountExp = amountPerMonth, AmountMax = amountPerMonthMax)
month(startDate) <- month(startDate) + 1
index = index + 1
}


}

我也尝试过这个,速度快一点

plotDf = data.frame("ApropYMD" =  c(seq(firstDayNextMonth, highestDate, by="months")))
plotDf$AmountExp = 0
plotDf$AmountMax = 0

for (i in 1:nrow(tmpPredictionDf)) {

startDate = tmpPredictionDf$ApropYMD[i]
amountPerMonth = (tmpPredictionDf$PredictionExp[i]/12)
amountPerMonthMax = (tmpPredictionDf$PredictionMax[i]/12)

print(i)

for (j in 1:12) {

plotDf$AmountExp[which(plotDf$ApropYMD == startDate)] = plotDf$AmountExp[which(plotDf$ApropYMD == startDate)] + amountPerMonth
plotDf$AmountMax[which(plotDf$ApropYMD == startDate)] = plotDf$AmountMax[which(plotDf$ApropYMD == startDate)] + amountPerMonthMax
month(startDate) <- month(startDate) + 1

}

我想将一个日期的金额分布在接下来的 12 个月内,每行插入约 5.500 行 -> 5.500*12 = 66.000 行

Input       
ApropYMD AmountExp AmountMax
2019-01-01 6000 12000

Output
ApropYMD AmountExp AmountMax
2019-01-01 500 1000
2019-01-02 500 1000
2019-01-03 500 1000
2019-01-04 500 1000
2019-01-05 500 1000
2019-01-06 500 1000
2019-01-07 500 1000
2019-01-08 500 1000
2019-01-09 500 1000
2019-01-10 500 1000
2019-01-11 500 1000
2019-01-12 500 1000

最佳答案

不建议在循环中填充数据帧,而且通常很慢。我们可以使用预先存在的函数来做到这一点。例如,一种方法是使用 tidyr::complete 来实现此目的。假设您有“Date”类的 ApropYMD,我们可以通过对每一行进行分组并为每个月创建日期序列,然后除以 first 值,将每行扩展为 12 行AmountExpAmountMax 乘以 12,以便均匀分布。

library(dplyr)
library(tidyr)

df %>%
group_by(group = row_number()) %>%
complete(ApropYMD = seq(ApropYMD, length.out = 12, by = "month"),
fill = list(AmountExp = 0, AmountMax = 0)) %>%
mutate(AmountExp = first(AmountExp)/12,
AmountMax = first(AmountMax)/12) %>%
ungroup() %>%
select(-group)


# A tibble: 24 x 3
# ApropYMD AmountExp AmountMax
# <date> <dbl> <dbl>
# 1 2019-01-01 500 1000
# 2 2019-02-01 500 1000
# 3 2019-03-01 500 1000
# 4 2019-04-01 500 1000
# 5 2019-05-01 500 1000
# 6 2019-06-01 500 1000
# 7 2019-07-01 500 1000
# 8 2019-08-01 500 1000
# 9 2019-09-01 500 1000
#10 2019-10-01 500 1000
# … with 14 more rows

数据

添加了另外一行来测试解决方案

df <- read.table(text = "ApropYMD    AmountExp   AmountMax
2019-01-01 6000 12000
2018-01-01 12000 24000", header = T)
df$ApropYMD <- as.Date(df$ApropYMD)

关于r - 在 R 中逐行构建复杂数据帧的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55699410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com