如何对含-inf到+inf数值的R DataFrame按行排名?
解决按行排名的问题
首先得注意到你提供的DataFrame里的数值其实是字符类型的(从structure里的c("-5", "3")能看出来),所以第一步必须先把这些列转换成数值型,不然没法正确计算排名。
步骤1:转换数据类型
先把所有列转为数值型,这里用lapply就可以轻松实现:
# 转换字符列为数值型 df[] <- lapply(df, as.numeric)
步骤2:按行计算降序排名
你的需求是数值越大排名越靠前(比如第一行里2是最大的,对应排名1),而R里默认的rank()函数是升序(数值越小排名越靠前),所以我们可以通过对数值取反来实现降序排名,再用apply按行处理:
# 按行计算排名,取反后排名等价于原数值的降序排名 df_rank <- as.data.frame(t(apply(df, 1, function(x) rank(-x)))) # 保持原列名 colnames(df_rank) <- colnames(df)
验证结果
运行完上面的代码后,df_rank就会和你期望的结果完全一致:
StockA StockB StockC 1 3 1 2 2 1 2 3 3 1 3 2
如果你的R版本是4.0.0及以上,也可以直接用rank()的decreasing参数,代码会更直观:
df_rank <- as.data.frame(t(apply(df, 1, function(x) rank(x, decreasing = TRUE)))) colnames(df_rank) <- colnames(df)
这样就完美解决你的按行排名需求啦~
内容的提问来源于stack exchange,提问作者Niccola Tartaglia
相关产品推荐
相关产品推荐

