如何从 12 个不同的列和 return 关联的行名称中提取前三个值?
How to extract top three values from 12 different columns and return the associated row name?
我正在使用 R 中内置的 43x12 数据集。43 行是不同人的名字,12 列是不同的统计数据。我需要获得在每个统计数据中得分前 3 名的人名。我基本上可以做到这一点,除非两个人对一个统计数据具有完全相同的值,我需要通过使用另一个统计数据来打破平局,我不知道该怎么做。此外,如果它们具有相同的统计值,我当前的方法将不起作用。我使用的内置数据集是 USJudgeRatings
。以下是我如何获得 CONT 的前 3 名,效果很好,但类似的方法不适用于 INTG,因为两个人具有相同的统计数据,这是该类别中第二高的。
sortedCont <- sort(USJudgeRatings$CONT, decreasing = TRUE)
ContFilter1 <- USJudgeRatings$CONT == sortedCont[1]
ContFilter2 <- USJudgeRatings$CONT == sortedCont[2]
ContFilter3 <- USJudgeRatings$CONT == sortedCont[3]
BestJudges[1,1] <- rownames(USJudgeRatings[ContFilter1,])
BestJudges[1,2] <- rownames(USJudgeRatings[ContFilter2,])
BestJudges[1,3] <- rownames(USJudgeRatings[ContFilter3,])
您可以使用 head
获取最上面的行,例如:
row.names(head(USJudgeRatings[order(USJudgeRatings$CONT,decreasing =T),],3))
[1] "CALLAHAN,R.J." "LEVISTER,R.L." "WALL,R.A."
然后你可以使用sapply
将它应用到每一列:
sapply(USJudgeRatings, function(col)
row.names(head(USJudgeRatings[order(col,decreasing =T),],3)))
CONT INTG DMNR DILG CFMG DECI PREP
[1,] "CALLAHAN,R.J." "RUBINOW,J.E." "RUBINOW,J.E." "RUBINOW,J.E." "NARUK,H.J." "NARUK,H.J." "RUBINOW,J.E."
[2,] "LEVISTER,R.L." "CALLAHAN,R.J." "CALLAHAN,R.J." "NARUK,H.J." "DALY,J.J." "RUBINOW,J.E." "NARUK,H.J."
[3,] "WALL,R.A." "O'SULLIVAN,T.J." "DALY,J.J." "BERDON,R.I." "CALLAHAN,R.J." "BERDON,R.I." "BERDON,R.I."
FAMI ORAL WRIT PHYS RTEN
[1,] "RUBINOW,J.E." "RUBINOW,J.E." "RUBINOW,J.E." "CALLAHAN,R.J." "RUBINOW,J.E."
[2,] "NARUK,H.J." "NARUK,H.J." "NARUK,H.J." "NARUK,H.J." "CALLAHAN,R.J."
[3,] "BERDON,R.I." "CALLAHAN,R.J." "BERDON,R.I." "RUBINOW,J.E." "NARUK,H.J."
我正在使用 R 中内置的 43x12 数据集。43 行是不同人的名字,12 列是不同的统计数据。我需要获得在每个统计数据中得分前 3 名的人名。我基本上可以做到这一点,除非两个人对一个统计数据具有完全相同的值,我需要通过使用另一个统计数据来打破平局,我不知道该怎么做。此外,如果它们具有相同的统计值,我当前的方法将不起作用。我使用的内置数据集是 USJudgeRatings
。以下是我如何获得 CONT 的前 3 名,效果很好,但类似的方法不适用于 INTG,因为两个人具有相同的统计数据,这是该类别中第二高的。
sortedCont <- sort(USJudgeRatings$CONT, decreasing = TRUE)
ContFilter1 <- USJudgeRatings$CONT == sortedCont[1]
ContFilter2 <- USJudgeRatings$CONT == sortedCont[2]
ContFilter3 <- USJudgeRatings$CONT == sortedCont[3]
BestJudges[1,1] <- rownames(USJudgeRatings[ContFilter1,])
BestJudges[1,2] <- rownames(USJudgeRatings[ContFilter2,])
BestJudges[1,3] <- rownames(USJudgeRatings[ContFilter3,])
您可以使用 head
获取最上面的行,例如:
row.names(head(USJudgeRatings[order(USJudgeRatings$CONT,decreasing =T),],3))
[1] "CALLAHAN,R.J." "LEVISTER,R.L." "WALL,R.A."
然后你可以使用sapply
将它应用到每一列:
sapply(USJudgeRatings, function(col)
row.names(head(USJudgeRatings[order(col,decreasing =T),],3)))
CONT INTG DMNR DILG CFMG DECI PREP
[1,] "CALLAHAN,R.J." "RUBINOW,J.E." "RUBINOW,J.E." "RUBINOW,J.E." "NARUK,H.J." "NARUK,H.J." "RUBINOW,J.E."
[2,] "LEVISTER,R.L." "CALLAHAN,R.J." "CALLAHAN,R.J." "NARUK,H.J." "DALY,J.J." "RUBINOW,J.E." "NARUK,H.J."
[3,] "WALL,R.A." "O'SULLIVAN,T.J." "DALY,J.J." "BERDON,R.I." "CALLAHAN,R.J." "BERDON,R.I." "BERDON,R.I."
FAMI ORAL WRIT PHYS RTEN
[1,] "RUBINOW,J.E." "RUBINOW,J.E." "RUBINOW,J.E." "CALLAHAN,R.J." "RUBINOW,J.E."
[2,] "NARUK,H.J." "NARUK,H.J." "NARUK,H.J." "NARUK,H.J." "CALLAHAN,R.J."
[3,] "BERDON,R.I." "CALLAHAN,R.J." "BERDON,R.I." "RUBINOW,J.E." "NARUK,H.J."