【问题标题】:Rename column vectors in matrix by removing ".x", ".x.x" etc通过删除“.x”、“.x.x”等重命名矩阵中的列向量
【发布时间】:2019-12-11 18:45:06
【问题描述】:

我有一个滚动的数据窗口。考虑矩阵中的列名如下:

Jan.94, Feb.94, Mar.94, Apr.94, Feb.94.x, Mar.94.x, Apr.94.x, May.94.x, Mar.94.xx, Arp .94.xx、May.94.xx 等等。

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

【问题讨论】:

  • 您希望如何解决删除 X 导致两列同名的情况?
  • @LenGreski 除非 R 不允许两个(或更多)向量具有相同的名称,否则在我的应用程序中不会有问题。
  • 请阅读How to Create a Minimal, Reproducible Example 并更新您的问题。

标签: r rename rolling-computation


【解决方案1】:

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

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

【讨论】:

  • 这真的很有帮助!有没有办法只保留名称的前 6 个字符?
  • @JC3019 - “只保留前 6 个字符...”是什么意思?将""substr() 函数一起使用会删除字符串中.x 的任何实例占用的空格。如果数据仅包含 6 个字符的日期指示符 mmm.yy,则 substr() 将产生 6 个字符的列名。
【解决方案2】:

如果数据存储在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

但是,如果需要使用$ 形式的extract operator 访问类型为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
> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-25
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2021-01-14
    相关资源
    最近更新 更多