我想如何使用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)
请让我知道如何处理
如果只需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)