我们假设我有一个这样的数据框:
> 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中提供的解决方案不能扩展(因为我有这么多列!),而2(使用lag())似乎是按行进行差异。
任何帮助(提示,指针,重定向)都将不胜感激!
结束记录
如果您可以教我一种巧妙地为新结果表的列命名的方法,那么也会非常感激。比如列将被命名(在这个给定的例子中):" sale12"和"销售23"
答案 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