通过删除“.x”、“.x.x”等重命名矩阵中的列向量

Rename column vectors in matrix by removing ".x", ".x.x" etc

我有滚动 window 数据。将矩阵中的列名称视为如下:

94年1月、94年2月、94年3月、94年4月、2月94.x、3月94.x、4月94.x、5月[=17] =], Mar.94.x.x, Arp.94.x.x, May.94.x.x 等等.

基本上,我想从 colnames 中删除所有 x,以便只保留日期。矩阵非常大。我需要应用一个函数,以便它只保留前 6 个字符,从而删除所有的 'x'

所以这很容易做到,假设你的矩阵叫做 x 那么你只需要

colnames(x) <- gsub(".x","",colnames(x),fixed = T)

如果数据存储在 matrix() 类型的对象中,并且对矩阵的后续操作使用行和列引用而不是命名列,则原始答案可以正常工作。

我们将生成数据矩阵、重命名列并显示矩阵。 set.seed() 用于确保 runif() 函数的可重复性。

set.seed(3104)
nameList <- c('Jan.94','Feb.94','Mar.94',
              'Jan.94.x','Feb.94.x','Mar.94.x',
              'Jan.94.x.x','Feb.94.x.x','Mar.94.x.x')
x <- matrix(runif(90),nrow=10,ncol=9)
colnames(x) <- gsub(".x","",nameList,fixed=TRUE)
head(x)

...和输出:

> head(x)
         Jan.94    Feb.94    Mar.94    Jan.94    Feb.94     Mar.94     Jan.94
[1,] 0.73967666 0.3950552 0.4593954 0.5246329 0.9318526 0.97022213 0.51974938
[2,] 0.78333764 0.8019435 0.3277070 0.8342044 0.9564895 0.31632572 0.02162478
[3,] 0.07161414 0.3681912 0.5151378 0.8647585 0.9841725 0.69784065 0.05600622
[4,] 0.92636930 0.6643402 0.2357173 0.6178838 0.5324841 0.42694750 0.13356315
[5,] 0.26566868 0.7210794 0.6275253 0.9630575 0.5757118 0.63363792 0.30718159
[6,] 0.57439103 0.1076186 0.8501558 0.0615584 0.3375161 0.06738025 0.25910038
         Feb.94     Mar.94
[1,] 0.82225954 0.94697173
[2,] 0.03341796 0.08548795
[3,] 0.99208753 0.37739177
[4,] 0.85306984 0.00283353
[5,] 0.61724901 0.16111121
[6,] 0.21789765 0.07376294

但是,如果需要使用 $ 形式访问类型为 data.frame() 的对象中的列,当多个列具有相同的值时,会得到意想不到的结果列名称。

# use with data.frame() introduces subtle defect 
# when using the $ form of the extract operator
set.seed(3104)
x <- data.frame(matrix(runif(90),nrow=10,ncol=9))
colnames(x) <- gsub(".x","",nameList,fixed=TRUE)
# extract only retrieves the first column named Jan.94
x$Jan.94

...和输出:

> x$Jan.94
 [1] 0.73967666 0.78333764 0.07161414 0.92636930 0.26566868 0.57439103
 [7] 0.60409610 0.10018717 0.67436946 0.90823532
> 

创建具有多个具有相同列名的列的 data.frame() 会导致提取运算符的 $ 形式无法访问数据框中的许多列。

也就是说,可以从数据框中提取具有相同名称的多个列,但这需要更多的努力。

head(x[,grepl("Jan.94",colnames(x))])

...结果:

> head(x[,grepl("Jan.94",colnames(x))])
      Jan.94  Jan.94.1   Jan.94.2
1 0.73967666 0.5246329 0.51974938
2 0.78333764 0.8342044 0.02162478
3 0.07161414 0.8647585 0.05600622
4 0.92636930 0.6178838 0.13356315
5 0.26566868 0.9630575 0.30718159
6 0.57439103 0.0615584 0.25910038
>