首页 > 解决方案 > 同质化使用字符串中的一位数和两位数

问题描述

我有一个非常大的 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)或我错过的另一种方法?

标签: rstringdata.tabledata-management

解决方案


另一个可能是最简单的选项是使用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

推荐阅读