R:如何根据数据框中指定的排名(而不是值的顺序)使用 cumsum()?

问题描述 投票:0回答:1

考虑到我有一个像这样的数据框,其中每列下都指定了排名。 (这意味着 A 列下的第 1 行排名第三,然后第 2 行排名第一,第 3 行排名第二。在 B 列下,第 1 行排名第一,第 2 行排名第二,第 3 行排名第三。)

df <- data.frame("A" = c(3, 1, 2),
                 "B" = c(1, 2, 3))

我想要做的是创建一个代码,其中数据框将根据数据框中指定的排名被称为“累积倒数”的逻辑替换。

  1. 第一名 = 1/(1/1) = 1.0000
  2. 第二名 = 1/(1/1 + 1/2) = 0.6667
  3. 第三等级 = 1/(1/1 + 1/2 + 1/3) = 0.5454

由于我将处理实际数据集中的数千个排名,逻辑基本上是这样的:第n个排名 = 1/(1/1 + 1/2 + 1/3 ... + ... 1/n)

在我的示例数据框中,我希望用计算出的累积倒数替换排名,所以它应该看起来像这样。

expected.df <- data.frame("A" = c(0.5454, 1.0000, 0.6667),
                          "B" = c(1.0000, 0.6667, 0.5454))

我目前正在使用

cumsum()
和下面的代码,但我没有在 A 列下得到预期的结果。所以,我想我可能遗漏了一些东西。

df.current <- apply(df, 2, function(x) 1 /cumsum(1 / rank(x)))

我假设

cumsum()
可能基于每列下的排名顺序的值顺序进行操作,而不是实际上的排名?

ranking cumsum ranking-functions
1个回答
0
投票

不是最快的选择,但您可以使用类似的方法

tidyverse
:

### Packages
library(dplyr)
library(purrr)

### Data
df=data.frame("A" = c(3, 1, 2),
              "B" = c(1, 2, 3))

### Applying a function (with a map operation) on each column
 expected.df=df %>%
 mutate(across(everything(),function(z){map(z,~1/sum(1/1:.x))}))

输出:

          A         B
1 0.5454545         1
2         1 0.6666667
3 0.6666667 0.5454545
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.