r - 同质化使用字符串中的一位数和两位数
问题描述
我有一个非常大的 data.table,其中(大量)项目由包括文本和数字的字符串定义。
library(data.table)
dd <- data.table(x = c("A4","A4","A4","A14","A14","A14","B4","B4","B4"),y = c("A4","A14","B4","A4","A14","B4","A4","A14","B4"), z = c(1,2,3,4,5,6,7,8,9))
x y z
A4 A4 1
A4 A14 2
A4 B4 3
A14 A4 4
A14 A14 5
A14 B4 6
B4 A4 7
B4 A14 8
B4 B4 9
数字可以是一位数或两位数,因此 R 将始终根据数字中的第一个数字(A14 在 A4 之前)对它们进行排序。混合排序可以处理这个问题。但是,当我将长数据重塑为宽
wide <- dcast(dd, x ~ y, value.var = "z")
R 正在根据基本排序规则再次应用排序。
x A14 A4 B4
A14 5 4 6
A4 2 1 3
B4 8 7 9
但是,我需要以下矩阵计算的原始顺序。有没有任何有效的方法可以将字符串 + 个位数重命名为字符串 + 双位数(A4 -> A04)或我错过的另一种方法?
解决方案
另一个可能是最简单的选项是使用mixedorder
-package gtools
:
wide <- dcast(dd, x ~ y, value.var = "z")[gtools::mixedorder(x)]
这使:
> wide x A14 A4 B4 1: A4 2 1 3 2: A14 5 4 6 3: B4 8 7 9
如果您还想以相同的方式设置列顺序,您还可以使用setcolorder
:
setcolorder(wide, c(1, gtools::mixedorder(names(wide)[-1]) + 1))
然后给出:
> wide x A4 A14 B4 1: A4 1 2 3 2: A14 4 5 6 3: B4 7 8 9
推荐阅读
- laravel - Laravel Eloquent 关系从另一个表中获取一列
- angular - 即使成功运行,我的角度组件也没有包含在我的角度模块中
- windows - 如何为 Windows 10 创建一个快捷方式来重命名评论属性或任何属性?
- c# - RedirectToAction() 和 View() 有什么区别
- types - 总和类型的结构类型
- python-3.x - 我如何在更大的列表中搜索列表而不考虑顺序?
- html - Blazor:浏览器不更新 HTML 按钮的样式属性
- python - 从python中的字符串中找到一个特殊字符并删除后面的部分
- shopify - Shopify:为什么动态结账按钮总是被禁用?
- java - 如何在 telnet 会话期间迭代队列?