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