gpt4 book ai didi

R中的按行排序

转载 作者:行者123 更新时间:2023-12-04 01:52:11 26 4
gpt4 key购买 nike

我想知道如何使用 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按行,使用 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 'wide' 格式到 'long' 格式,按 'Name' 分组,我们 order 'i' 中按降序排列的 'value',获取 Data.table 的子集( .SD ),创建一个新列('N'),按 'Name' 分组并使用 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

编辑:
以上 data.table如果您有 10 个或更多带有值的列,解决方案将不起作用,因为这样 col10将在 col2 之前在排序中,即使更高的值将存储在 col2 中.要解决此问题,您可以仅使用数字作为新列的名称,如下所示:
dcast(melt(setDT(df1), id.var='Name')[order(-value), 
.SD, Name][, N:=1:.N , .(Name)],
Name~N, value.var=c("variable", "value"))

关于R中的按行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35891340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com