考虑到我有一个像这样的数据框,其中每列下都指定了排名。 (这意味着 A 列下的第 1 行排名第三,然后第 2 行排名第一,第 3 行排名第二。在 B 列下,第 1 行排名第一,第 2 行排名第二,第 3 行排名第三。)
df <- data.frame("A" = c(3, 1, 2),
"B" = c(1, 2, 3))
我想要做的是创建一个代码,其中数据框将根据数据框中指定的排名被称为“累积倒数”的逻辑替换。
由于我将处理实际数据集中的数千个排名,逻辑基本上是这样的:第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()
可能基于每列下的排名顺序的值顺序进行操作,而不是实际上的排名?
不是最快的选择,但您可以使用类似的方法
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