如何在data.frame中动态创建差异列或增量列?

时间:2017-11-29 03:52:34

标签: arrays r dataframe vectorization difference

我的dataframe包含来自BalanceBalance1Balance2,...,Balance36的未结余额的列名。

我想为每个月之间的增量添加一列,即Delta2 = Balance2 - Balance1

如何通过以下方法简化。

dataset$delta1 = apply(dataset[, c("Balance1","Balance")], 1, function(x){x[2]-x[1]})
dataset$delta2 = apply(dataset[, c("Balance2","Balance1")], 1, function(x){x[2]-x[1]})
...
dataset$delta35 = apply(dataset[, c("Balance35","Balance34")], 1, function(x){x[2]-x[1]})
dataset$delta36 = apply(dataset[, c("Balance36","Balance35")], 1, function(x){x[2]-x[1]})

1 个答案:

答案 0 :(得分:0)

归结为单线。首先,将数据集命名为short,df是通常的名称。然后,使用直接减法;没有必要调用apply()从另一列中减去一列:

df$delta1 <- df[,"Balance1"] - df[,"Balance"]
df$delta2 <- df[,"Balance2"] - df[,"Balance1"]
...
df$delta35 <- df[,"Balance35"] - df[,"Balance34")]
df$delta36 <- df[,"Balance36"] - df[,"Balance35")]

但是由于整个计算具有规则结构,我们实际上只讨论生成Nx36差异数组,因此使用数字列索引。说出你的平衡*&#34;列索引是(50:85),你的delta_cols是100:135,或者其他什么。然后你的&#34;余额*&#34;的LHS指数减法为balance_lhs <- (50:84),RHS指数为(51:85),或仅为((50:84)+1)(请记住大多数运算符在R中添加向量化)

所以你的Nx36阵列只能通过单行生成:

df[,delta_cols] <- df[,(balance_lhs+1)] - df[,balance_lhs]

您可以通过编程方式计算delta_cols <- which(colnames(df) == c("delta1",...,"delta36"),以避免代码中出现幻数列索引。