添加新变量财务数据集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