添加新变量财务数据集r

添加新变量财务数据集r,r,R,我有一个关于金融交易数据集的问题。 数据集如下所示: Account_from Account_to Value Timestamp 1 1 2 10 1 2 1 3 15 1 3 3 4 20 1 4 2 1 10 2 5

我有一个关于金融交易数据集的问题。 数据集如下所示:

    Account_from  Account_to  Value  Timestamp  
1         1           2        10        1
2         1           3        15        1
3         3           4        20        1
4         2           1        10        2
5         1           3        25        2
6         2           1        15        3
7         1           3        10        3
8         1           4        20        4
我想基于列中的
帐户创建两个额外变量。我要创建的变量是:
(过去两个时间戳中的账户外总价值)

(最近两个时间戳中的帐户传入总值)

(在该时间戳期间完成的所有事务的时间戳之外的总事务值)

(账户外价值/以前的账户外价值),

它看起来是这样的:

    Acc_from  Acc_to  Value  Timestamp  Tot_val_out  Tot_val_inc  Tot_val_out_1time   val_out/prev_val_out
1       1        2     10        1           10           0              45                    0
2       1        3     15        1           25           0              45                   1.5
3       3        4     20        1           20           15             45                    0
4       2        1     10        2           10           10             35                    0
5       1        3     25        2           50           10             35                   1.67
6       2        1     15        3           25           0              25                   1.5
7       1        3     10        3           35           25             25                   0.4
8       1        4     20        4           30           15             20                    2
例如,第5行tot_val_out为50,这意味着账户1在最后两个时间戳(时间戳1和2)中转移了50的金额。在第8行,账户1在最后两个时间戳(时间戳3和4)中传输了30个

对于传入值也应该这样做

此外,我还想创建变量:

(在前4个时间戳中按帐户完成的交易数)

(在前2个时间戳中按帐户完成的交易数)

以便:

    Account_from  Account_to  Value  Timestamp  Transactions_previous4  Transactions_previous2
1         1           2        10        1                 1                      1
2         1           3        15        1                 2                      2
3         3           4        20        1                 1                      1
4         2           1        10        2                 1                      1
5         1           3        25        2                 3                      3
6         2           1        15        3                 2                      2
7         1           3        10        3                 4                      2
8         1           4        20        4                 5                      2
在第8行,账户1在最后4个时间戳(时间戳1到4)中进行了5次交易,但在最后2个时间戳(时间戳3和4)中仅进行了2次交易

我不知道怎么做。如果有人知道如何做到这一点,那将是非常有帮助的

提前感谢,

这是一个基本的R代码

for (k in seq(nrow(df))) {
  nr <- seq(nrow(df))
  Account_from <- df$Account_from
  Account_to <- df$Account_to
  Value <- df$Value
  Timestamp <- df$Timestamp

  df$Tot_val_out[k] <- sum(Value[which(Account_from == Account_from[k] & Timestamp %in% (Timestamp[k]-(1:0)) & nr<=k)])
  df$Tot_val_in[k] <- sum(Value[which(Account_to == Account_from[k] & Timestamp %in% (Timestamp[k]-(1:0)) & nr<=k)])
  df$Transactions_previous4[k] <- length(which(Account_from == Account_from[k] & Timestamp %in% (Timestamp[k]-(3:0)) & nr<=k))
  df$Transactions_previous2[k] <- length(which(Account_from == Account_from[k] & Timestamp %in% (Timestamp[k]-(1:0)) & nr<=k))
}

dfout <- cbind(df,
               with(df,
                    data.frame(Tot_val_out_1time = ave(Value,Timestamp,FUN = sum),
                               val_out_prev_val_out = ave(Value, Account_from, FUN = function(x) c(0,x[-1]/x[-length(x)])))))

到目前为止您尝试了什么?您可以使用
dplyr::mutate
zoo::rollappy
。所以,类似于
newdf%mutate(Tot_val_out=rollaply(Acc_from,这里你添加了你想要的转换)
@novica谢谢,但我如何应用它,它只在最后两个时间段有效?你能解释一下为什么
Tot_val_out
在第7行是35吗?当然,第7行
Tot_val_out
是35,因为来自(1) 在最后两个时间段(时间戳2和3)中进行了两次交易。一次在第5行,值为25,第二次在第7行,值为10。因此,总价值为(从该交易(1)的账户中)是35。你明白了吗?或者我应该进一步解释一下吗?谢谢,我已经运行了四个小时了,但它还没有完成。数据集有100万个事务。我想这是正常的吗?@Florisvis因为我使用了
for
循环,当你有很多行时,它会相当慢。可能有一些更简单的方法,但我没有更多的方法主意
> dfout
  Account_from Account_to Value Timestamp Tot_val_out Tot_val_in Transactions_previous4 Transactions_previous2 Tot_val_out_1time val_out_prev_val_out
1            1          2    10         1          10          0                      1                      1                45             0.000000
2            1          3    15         1          25          0                      2                      2                45             1.500000
3            3          4    20         1          20         15                      1                      1                45             0.000000
4            2          1    10         2          10         10                      1                      1                35             0.000000
5            1          3    25         2          50         10                      3                      3                35             1.666667
6            2          1    15         3          25          0                      2                      2                25             1.500000
7            1          3    10         3          35         25                      4                      2                25             0.400000
8            1          4    20         4          30         15                      5                      2                20             2.000000