r - 按 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
现在,我想根据var1
vector对数据框进行排序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
和排序并保持原始列顺序。var1
id
知道如何排序吗?
解决方案
笔记。正如 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
。
推荐阅读
- angular - Ngx-datatable - 在行值更新时删除过滤数据
- typescript - Typescript枚举类型检查条件类型?
- angular - 应用程序中的不同模板组件
- javascript - Selenium 点击播放用 Viedogular 包装的电影
- c - 如何将数组结构传递给函数
- java - com.sun.net.ssl.internal.Provider:tools:jar 的“dependencies.dependency.version”缺失
- office-js - 从 Excel 加载项创建新电子邮件
- kotlin - Kotlin 可迭代
- reactjs - 为什么在路由级别应用拆分仍然需要整个 bundle.js 文件?
- node.js - 猫鼬没有带来任何结果