R中的按行排序

Ram*_*Ram 6 r

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

Name  English Math  French
John    56    78    86
Sam     79    97    86
Viru    93    44    34
Run Code Online (Sandbox Code Playgroud)

我想对上述数据集进行逐行排序。如下所示。

Name  
John   French  86   Math 78  English 56 
Sam    Math    97   French 86 English 79  
Viru    English 93   Math 44   French 34
Run Code Online (Sandbox Code Playgroud)

请让我知道如何处理

akr*_*run 8

如果只需sort要按行,请在转置输出后apply与一起使用MARGIN=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
Run Code Online (Sandbox Code Playgroud)

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


另一个选项将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
Run Code Online (Sandbox Code Playgroud)

或另一个选择是data.table。我们melt将“宽”格式转换为“长”格式,按“名称”分组,order将“值”按降序排列在“ i”中,获取Data.table(.SD)的子集,创建一个新列('N') ,按“名称”分组,并用于dcast将“长”转换为“宽”。

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
Run Code Online (Sandbox Code Playgroud)

编辑: 上述data.table解决方案将在没有的情况下工作,你有10个或更多的列与价值观,因为那样的话col10会preceed col2在订货,即使较高的值将被存储在col2。要解决此问题,您可以使用数字作为新列的名称,如下所示:

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