在R中排序排序

问题描述 投票:6回答:2

我想如何使用R在csv中进行行方式排序。这是我的以下数据

Name  English Math  French
John    56    78    86
Sam     79    97    86
Viru    93    44    34

我想对上面的数据集执行行方式排序。如下所示。

Name  
John   French  86   Math 78  English 56 
Sam    Math    97   French 86 English 79  
Viru    English 93   Math 44   French 34

请告诉我如何接近

r
2个回答
8
投票

如果我们只需要按行sort,请使用带有applyMARGIN=1,并在转置输出后将输出分配回原始列。

df1[-1] <- t(apply(df1[-1], 1, 
        FUN=function(x) sort(x, decreasing=TRUE)))

df1
#   Name English Math French
# 1 John      86   78     56
# 2  Sam      97   86     79
# 3 Viru      93   44     34

注意:但我们可能需要更改列名称,因为按行排序会给出新的排序值。


另一个选项是分别使用apply获取列名和值,Map我们得到相应的列,cbind第一列有输出。

nMat <- `dim<-`(names(df1)[-1][t(apply(df1[-1], 1,  
        order, decreasing=TRUE))], dim(df1[-1]))
vMat <- t(apply(df1[-1], 1,  sort, decreasing=TRUE))
cbind(df1[1], data.frame(Map(cbind, as.data.frame(nMat,
   stringsAsFactors=FALSE), as.data.frame(vMat))))
#  Name    V1.1 V1.2   V2.1 V2.2    V3.1 V3.2
#1 John  French   86   Math   78 English   56
#2  Sam    Math   97 French   86 English   79
#3 Viru English   93   Math   44  French   34

或者另一种选择是data.table。我们melt''宽'格式为'长'格式,按'名称'分组,我们order'''中的'值'按降序排列,得到Data.table(.SD)的子集,创建一个新列(' N'),按'名称'分组,并使用dcast将'long'转换为'wide'。

library(data.table)
dcast(melt(setDT(df1), id.var='Name')[order(-value), 
  .SD, Name][, N:=paste0("Col", 1:.N) , .(Name)],
    Name~N, value.var=c("variable", "value"))
#   Name variable_Col1 variable_Col2 variable_Col3 value_Col1 value_Col2 value_Col3
#1: John        French          Math       English         86         78         56
#2:  Sam          Math        French       English         97         86         79
#3: Viru       English          Math        French         93         44         34

编辑:上面的data.table解决方案将不起作用,如果您有10或更多列的值,因为然后col10将在排序中的col2之前,即使更高的值将存储在col2。要解决此问题,您可以使用just number作为新列的名称,如下所示:

dcast(melt(setDT(df1), id.var='Name')[order(-value), 
      .SD, Name][, N:=1:.N , .(Name)],
        Name~N, value.var=c("variable", "value"))

4
投票

你可以试试:

cbind(x[1],matrix(paste(colnames(x)[apply(x[,2:4],1,order,decreasing=TRUE)+1],
      apply(x[,2:4],1,sort,decreasing=TRUE)),ncol=3,byrow=TRUE))
#  Name          1         2          3
#1 John  French 86   Math 78 English 56
#2  Sam    Math 97 French 86 English 79
#3 Viru English 93   Math 44  French 34
© www.soinside.com 2019 - 2024. All rights reserved.