使用循环或 IF 函数根据条件在数据框中添加值 - 在 R 代码中

Adding values in data frame based on condition using Loops or IF function - in R code

我有一个数据,其中每个帐号给出每月现金余额。但是,为每个帐户 ID 提供数据的记录数或月数是不同的,比如有些有 12 个月的数据,有些有 24 个月的数据等等。我必须将所有数据放入 ARIMA 模型并预测下个月的余额。我注意到 ARIMA 模型在不均匀的时期不起作用,或者它会产生异常的结果。

`Account_id  Month  $ balance
A            201901 100
A            201902 120
A            201903 135
B            201903 20
C            201902 1700
C            201903 1400

` 我尝试添加缺少月份的行,并通过修改 excel 中的数据集将余额设为零,导致所有帐户具有相同数量的记录和月份。

我想通过 R 代码执行此手动步骤。我相信这应该是一些循环/IF 函数或 Rbind/cbind 之类的东西,但我对代码不是那么流利。请帮忙!

根据建议的解决方案,我尝试了这个:

每个月每个 id 产生 54 行,所有余额显示为 0

months <- as.character(seq(as.Date('2015-01-
01'),as.Date('2019-06-01'), by = "1 month"))

accounts <- df$account_id

shell <- expand.grid(Account_id = accounts, Month = months, stringsAsFactors 
= F)

data <- data.frame(Account_id = df$account_id, Month = 
df$partition_ledger_year_month, balance = df$amount_usd,stringsAsFactors = F)

df2 <- merge(shell, data, by=c('Account_id','Month'), all.x = T)

df2[which(is.na(df2$balance)),]$balance <- 0

预期输出:

`Account_id  Month  $ balance
A            201901 100
A            201902 120
A            201903 135
B            201901 0
B            201902 0
B            201903 20
C            201901 0
C            201902 1700
C            201903 1400

所有值都在我的数据框列中,只是我必须缺少余额为“0”的飞蛾。任何账户id的完整数据都是54个月。

做一个零余额的 shell data.frame,然后填写你的余额如何:

# All Possible Months
months <- as.character(seq(as.Date('2019-01-01'),as.Date('2020-01-01'), by = "1 month"))

# All Possible account ids
accounts <- LETTERS

# A shell
shell <- expand.grid(Account_id = accounts, Month = months, stringsAsFactors = F)

# Your data
data <- data.frame(Account_id = c('A','B','A'), Month = c('2019-02-01', '2019-03-01','2019-01-01'), balance = c(100,200,300),stringsAsFactors = F)

# Left Join to the shell
df <- merge(shell, data, by=c('Account_id','Month'), all.x = T)

# Fill in missing balances
df[which(is.na(df$balance)),]$balance <- 0


df

您可以使用 tidyr::complete 并用 0 填充 balance 的缺失值。

df1 <- tidyr::complete(df, Account_id, Month, fill = list(balance = 0))
df1
# A tibble: 9 x 3
#  Account_id  Month balance
#  <chr>       <int>   <dbl>
#1 A          201901     100
#2 A          201902     120
#3 A          201903     135
#4 B          201901       0
#5 B          201902       0
#6 B          201903      20
#7 C          201901       0
#8 C          201902    1700
#9 C          201903    1400

数据

df <- structure(list(Account_id = c("A", "A", "A", "B", "C", "C"), 
    Month = c(201901L, 201902L, 201903L, 201903L, 201902L, 201903L
    ), balance = c(100L, 120L, 135L, 20L, 1700L, 1400L)), 
    class = "data.frame", row.names = c(NA, -6L))