对数据框中的多个列进行排名
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))
我有一个月度库存数据框 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))