首页 > 解决方案 > 按 id 对数据框中的一个变量进行排序

问题描述

我有一个数据框,其中包含许多由 id 变量分隔的公司信息。我想对其中一个变量进行排序并为每个 id 重复它。让我们举这个例子,

df <- structure(list(id = c(110, 110, 110, 90, 90, 90, 90, 252, 252
), var1 = c(26, 21, 54, 10, 18, 9, 16, 54, 39), var2 = c(234, 
12, 43, 32, 21, 19, 16, 34, 44)), .Names = c("id", "var1", "var2"
), row.names = c(NA, -9L), class = "data.frame")

看起来像这样

df
   id var1 var2
1 110   26  234
2 110   21   12
3 110   54   43
4  90   10   32
5  90   18   21
6  90    9   19
7  90   16   16
8 252   54   34
9 252   39   44

现在,我想根据var1vector对数据框进行排序id。我能想到的最简单的解决方案是使用apply这样的功能,

> apply(df, 2, sort)
       id var1 var2
 [1,]  90    9   12
 [2,]  90   10   16
 [3,]  90   16   19
 [4,]  90   18   21
 [5,] 110   21   32
 [6,] 110   26   34
 [7,] 110   39   43
 [8,] 252   54   44
 [9,] 252   54  234

但是,这不是我想要的输出。正确的输出应该是,

   id var1 var2
1 110   21   12
2 110   26  234
3 110   54   43
4  90    9   19
5  90   10   32
6  90   16   16
7  90   18   21
8 252   39   44
9 252   54   34

按列分组id和排序保持原始列顺序。var1id

知道如何排序吗?

标签: rsortinggrouping

解决方案


笔记。正如 Moody_Mudskipper 所说,不需要使用tidyverse,也可以使用 base 轻松完成R

df[order(ordered(df$id, unique(df$id)), df$var1), ]

tidyverse没有任何temp变量的单行解决方案:

library(tidyverse)
df %>% arrange(ordered(id, unique(id)), var1)
#    id var1 var2
# 1 110   26  234
# 2 110   21   12
# 3 110   54   43
# 4  90   10   32
# 5  90   18   21
# 6  90    9   19
# 7  90   16   16
# 8 252   54   34
# 9 252   39   44

解释为什么apply(df, 2, sort)不起作用

你试图做的是独立地对每一列进行排序。apply运行指定的维度(2在这种情况下对应于列)并应用函数(sort在这种情况下)。

apply试图进一步简化结果,在本例中为矩阵。因此,您将返回一个矩阵(而不是 a data.frame),其中每一列都是独立排序的。例如apply调用中的这一行:

# [1,]  90    9   12

原来甚至不存在data.frame


推荐阅读