对数据框中的多个列进行排名

Rank several columns in a dataframe

我有一个月度库存数据框 returns(每行是一个月):

df:
            Stock A Stock B Stock C ....
Jun 1927     1%    2%        3%
Jul 1927     3%    1%        2%
Aug 1927     2%    3%        1%
Sep 1927     5%    2%        9%
...
...

我想根据 returns 对每个月的股票进行排名,并据此创建一个新的数据框。

所以像这样:

df_rank:
            Stock A Stock B Stock C
Jun 1927     1      2         3
Jul 1927     3      1         2
Aug 1927     2      3         1
Sep 1927     2      3         1

我在想这样的事情:

df_rank<-data.frame(matrix(NA, nrow = nrow(df), ncol = ncol(df)))
for (i in seq(1:nrow(df))){
   df1<-data.frame(rank(df[i,]))
   df_rank<-cbind(df_rank,df1)
}

我们可以删除 % 然后使用 rank:

df[] <- t(sapply(as.data.frame(t(df)), 
        function(x) rank(as.numeric(sub("[%]", "", x)))))

如果我们将您的数据作为 data.frame 进行了一些百分比更改。

     month StockA StockB StockC
1 Jun 1927     1%     2%     3%
2 Jul 1927     3%     1%    -4%
3 Aug 1927   6.4%     3%     4%

我们可以对行使用 运行 函数。为了让它恢复正确的形状,我们需要应用转置。

t(apply(df[, -1], 1, rank))
     StockA StockB StockC
[1,]      1      2      3
[2,]      3      2      1
[3,]      3      1      2

# to replace the data in the data.frame
df[, -1] <- t(apply(df[, -1], 1, rank))
df
     month StockA StockB StockC
1 Jun 1927      1      2      3
2 Jul 1927      3      2      1
3 Aug 1927      3      1      2

现在我只是根据字符值对百分比进行排名。也可以用ak运行的函数,先把%号去掉,设置成数字再排序。

t(apply(df[, -1], 1,  function(x) rank(as.numeric(sub("[%]", "", x)))))

在此示例中,结果是相同的。但是对于很多百分比,使用实数而不是字符可能会更好。

数据:

df <- structure(list(month = c("Jun 1927", "Jul 1927", "Aug 1927"), 
                     StockA = c("1%", "3%", "6.4%"), 
                     StockB = c("2%", "1%", "3%"), 
                     StockC = c("3%", "-4%", "4%")), 
                .Names = c("month", "StockA","StockB", "StockC"),
                class = "data.frame", row.names = c(NA, -3L))