R:如何找到列之间的百分比差异以及相应的命名?
假设我有这样一个数据帧:R:如何找到列之间的百分比差异以及相应的命名?,r,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的两个销售季节之间的百分比差异。 所以基
> 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的两个销售季节之间的百分比差异。
所以基本上:
[销售n+1]-[销售n])/[销售n]每行,其中n=销售列索引
我想在所有列中都这样做,并将百分比差异放入一个新表中
因此,最终结果表将包含“id”列和N-1列,其中N=原始数据帧中的列数(id列除外)
对于我上面给出的示例df,所需的输出是(除id列以外的所有值都以百分比表示):
我读过如下文章:
但是在1中提供的解决方案不可伸缩(因为我有这么多列!),而在2中(使用lag())似乎是逐行进行差异
任何帮助(提示、指针、重定向)将不胜感激
结束注释
如果您能教我一种方法,使新结果表的列相应地命名,我将不胜感激;与将命名的列类似(在本示例中):“sale12”和“sale23”您可以在调用
lappy
时使用setNames
。以第一个sales列为例,您可以在其中计算百分比,第3列,并循环到sales列的末尾。我使用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
d您可以在调用lappy
时使用setNames
。以第一个sales列为例,您可以在其中计算百分比,第3列,并循环到sales列的末尾。我使用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
d这是否也会计算差异百分比?我看到您将公式放在setNames()函数中。为什么?你可以在公式中乘以100得到百分比。setNames
的第一个参数是您想要命名的东西,它是公式的结果。我的问题是为什么公式在setNames()函数中?我不明白为什么这是有效的。。。公式不应该在setNames()之外吗?在我们计算之后,我们会设定名字,对吗?不过,我确实测试了你的代码,它确实有效!我只是对语法感到困惑。非常感谢。如果您愿意,您可以在以后进行命名。您完全可以将setNames
放在lappy
的外部,或者在以后的步骤中使用names
。但是在?setNames
页面:“这是一个方便的函数,用于设置对象的名称并返回该对象。”我只是命名计算结果的列,并返回一个名称。希望这会有所帮助。因此,基本上,您不必为setNames()定义x(也称为输入数据);实际上,您只需在setNames()中创建x(输入数据)。我理解正确吗?这对我来说绝对是一种新的语法,但很高兴知道有这样的快捷方式选项!这是否也计算了百分比差异?我看到您将公式放在setNames()函数中。为什么?你可以在公式中乘以100得到百分比。setNames
的第一个参数是您想要命名的东西,它是公式的结果。我的问题是为什么公式在setNames()函数中?我不明白为什么这是有效的。。。公式不应该在setNames()之外吗?在我们计算之后,我们会设定名字,对吗?不过,我确实测试了你的代码,它确实有效!我只是对语法感到困惑。非常感谢。如果您愿意,您可以在以后进行命名。您完全可以将setNames
放在lappy
的外部,或者在以后的步骤中使用names
。但是在?setNames
页面:“这是一个方便的函数,用于设置对象的名称并返回该对象。”我只是命名计算结果的列,并返回一个名称。希望这会有所帮助。因此,基本上,您不必为setNames()定义x(也称为输入数据);实际上,您只需在setNames()中创建x(输入数据)。我理解正确吗?这对我来说绝对是一种新的语法,但很高兴知道有这样的快捷方式选项!