我想如何使用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
请告诉我如何接近
如果我们只需要按行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
注意:但我们可能需要更改列名称,因为按行排序会给出新的排序值。
另一个选项是分别使用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"))
你可以试试:
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