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(输入数据)。我理解正确吗?这对我来说绝对是一种新的语法,但很高兴知道有这样的快捷方式选项!