基于排名重新排列数据框的列。

4

I have the following dataframe (df1)

Type     CA     AR       OR
alpha    2      3        5
beta     1      5        6
gamma    6      2        8
delta    8      1        9
Total    17     11       28

我希望重新排列这个数据框,使其按"Total"行为基础进行降序排列。
结果数据框应该是这样的(df2)。
    Type     OR    CA     AR       
    alpha     5    2      3        
    beta      6    1      5        
    gamma     8    6      2        
    delta     9    8      1        
    Total     28   17     11

请注意,之前按照"CA, AR, OR"顺序排列的列现在已经根据总行数变为了"OR, CA, AR"(按降序排列)。

为了做到这一点,我尝试使用如下的rank函数:

rank_total <- rank(-df1)

这是给出排名的结果:
 [1] 2 1 3

但是,我不知道如何按照这些排名重新排序。

有人知道如何从这里继续吗?或者如果有另一种完全不同的方法来完成此操作,那就太好了!

非常感谢您提前的帮助!!

1个回答

3

尝试

 df2 <- df1[,c(1, order(-unlist(df1[df1$Type=='Total',-1]))+1)]
 df2
 #   Type OR CA AR
 #1 alpha  5  2  3
 #2  beta  6  1  5
 #3 gamma  8  6  2
 #4 delta  9  8  1
 #5 Total 28 17 11

或者使用 rank
 df1[,c(1, match(1:3, rank(-unlist(df1[nrow(df1),-1])))+1)]

数据

 df1 <- structure(list(Type = c("alpha", "beta", "gamma", "delta", "Total"
 ), CA = c(2L, 1L, 6L, 8L, 17L), AR = c(3L, 5L, 2L, 1L, 11L), 
  OR = c(5L, 6L, 8L, 9L, 28L)), .Names = c("Type", "CA", "AR", 
 "OR"), class = "data.frame", row.names = c(NA, -5L))

2
@user4918087 更新了我使用的数据。虽然它给出了预期的输出。 - akrun
1
第二种解决方案的排名完美运行!非常感谢你!! - user4918087
1
@user4918087 两种解决方案对我都有效。也许下次你应该使用 dput 来展示你正在处理的确切数据结构(就像 akrun 在这个答案底部所做的那样)。 - Frank
1
顺便说一下,“Type”作为行名可能更有意义,这样可以执行以下操作:df2[,order(-df2["Total",])]其中df2是df2 <- df[,-1]; rownames(df2) <- df$Type - Frank
1
@Frank 相较于加上 +1 使索引匹配,这种方式更为方便。 - akrun
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接