R:如何找到列之间的百分比差异并相应地命名?

时间:2016-05-29 23:29:25

标签: r

我们假设我有一个这样的数据框:

> df = data.frame(id = c(2,88,4), sale1 = c(100,200,50), sale2 = c(50,150,50), sale3 = c(60, 100, 75))
> df
  id sale1 sale2 sale3
1  2   100    50    60
2 88   200   150   100
3  4    50    50    75

我希望找到每个商品ID的每两个销售季节之间的百分比差异。 所以基本上:

  每行

[sale_n + 1] - [sale_n])/ [sale_n],其中n =销售列索引

我希望在所有列中执行此操作,并将%diff放入新表中。

所以最终结果表将包含" id"列加N-1列,其中N =原始数据帧中的列数(除了id列)。

对于上面给出的示例df,所需的输出将是(除了id列以外的所有值都是百分比):

> df_diff
  id sale12 sale23
1  2    -50     20
2 88    -25    -33
3  4      0     50

我已经阅读了以下内容:

  1. How to calculate percentage change from different rows over different spans
  2. Calculate percentage change in an R data frame
  3. 但是1中提供的解决方案不能扩展(因为我有这么多列!),而2(使用lag())似乎是按行进行差异。

    任何帮助(提示,指针,重定向)都将不胜感激!

    结束记录

    如果您可以教我一种巧妙地为新结果表的列命名的方法,那么

    也会非常感激。比如列将被命名(在这个给定的例子中):" sale12"和"销售23"

1 个答案:

答案 0 :(得分:3)

您可以在setNames的来电中使用lapply。在第一个销售列中,您可以计算百分比,第3列,然后循环到销售列的末尾。我使用x-2和x-1命名列,因为它们在这里是合适的,但它取决于n的值:

d <- df["id"]

n <- 3L # column where your first percent can be calculated
d[,2:length((n-1):dim(df)[2])] <- 
    lapply(n:dim(df)[2], function(x) setNames(((df[x] - df[x-1]) / df[x-1]),
                                              paste0("sales", x-2, x-1)))
#  id sales12    sales23
#1  2   -0.50  0.2000000
#2 88   -0.25 -0.3333333
#3  4    0.00  0.5000000