按照向量r对数据框进行排序。

3

我有些困难,无法弄清楚如何做到这一点。

我想通过包含与列表中相同因子的因子的列对数据帧进行排序。 但是,重要的是代码不改变每个因子中行的顺序。

有什么好的想法吗?

编辑:

salmon <- c("red", 3,7, 5)
bass <- c("red", 1,3,5)
shrimp <- c("blue", 1, 4, 2)
carp <- c("orange", 6, 6, 6)

dfex <- data.frame(salmon, bass, shrimp, carp)
dfex <- data.frame(t(dfex))

ordering <- c("blue", "orange", "red")

这里的想法是通过使用排序向量来重新排序数据框。


2
可复现的示例?(https://dev59.com/eG025IYBdhLWcg3whGSx) - Jilber Urbina
1
是的,我进行了负投票。在你之前的问题中,你被要求提供一个可重现的例子。 - Henrik
1
请不要在我解决问题后才回来取消踩,除非你打算回来解决问题。 - user2795569
1
通常情况下,你只会收到负面评价并被忽视。 - alap
1
@user2795569,如果你想引起对方的注意,你可能需要@他们。他们可能没有关注你的问题,也不会看到你是否进行了编辑。 - A5C1D2H2I1M1N2O1R2T1
2个回答

12

match()order() 的组合应该可以实现。

dfex[order(match(dfex[[1]], ordering)), ]

match()会告诉您在ordering中找到的每个值在第一列中的索引位置。通过这些位置排序将得到与ordering顺序相匹配的顺序。


6

首先,您构建数据框的方式有些复杂。您可以尝试以下方法:

dfex <- data.frame(v1=c("salmon","shrimp","carp"),
                   v2=c("red","blue","orange"),
                   v3=c(3,1,6),
                   v4=c(7,4,6),
                   v5=c(5,2,6))

然后,您可以通过使用行名称对数据框进行排序:
order <- c("blue", "orange", "red")
rownames(dfex) <- dfex$v2
dfex[order,]     

这给予:

           v1     v2 v3 v4 v5
blue   shrimp   blue  1  4  2
orange   carp orange  6  6  6
red    salmon    red  3  7  5

如果因子有多个,像我编辑的例子一样,这个代码还能正常工作吗?我在我的电脑上无法让它正常运行。 - user2795569
1
@juba 如果你将 bass 添加到数据框中(使用你的方法会创建重复的行名),我不确定你如何使其工作。 - plannapus
@juba我建议你将v2制作为一个因子,所需的顺序作为水平 (dfex$v2<-factor(dfex$v2,levels=order)),然后使用dfex[order(dfex$v2),]进行排序。 - plannapus
@plannapus是正确的,如果您的排序列中没有唯一值,它将无法工作。 - juba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接