为什么 R 将列名中的特殊字符更改为点

Why R Changes Special Characters In Column Name To Dots

我有一个更大的数据集,当我导入到 R 时,它的列名带有 , 和不同类型的特殊字符。

当我将此数据集用作另一个变量中的副本或作为另一个较小数据的子集或使用来自同一较大数据集的数据和列名执行不同类型的数据转换时,列名中的所有特殊字符更改为 ..

有没有办法保留列名中的特殊字符?我不希望 R 更改任何关于列名的内容。

请提出解决方案。

例子

> library(MASS)
> data(cats)
> cats <- cats[1:10,]
> cats
   Sex Bwt Hwt
1    F 2.0 7.0
2    F 2.0 7.4
3    F 2.0 9.5
4    F 2.1 7.2
5    F 2.1 7.3
6    F 2.1 7.6
7    F 2.1 8.1
8    F 2.1 8.2
9    F 2.1 8.3
10   F 2.1 8.5
> colnames(cats) <- c("A:17272,,1,MPR.rtn_rslt", "B:17272,,1,MPR.rtn_rslt", "C:17272,,1,MPR.rtn_rslt")
> cats
   A:17272,,1,MPR.rtn_rslt B:17272,,1,MPR.rtn_rslt C:17272,,1,MPR.rtn_rslt
1                        F                     2.0                     7.0
2                        F                     2.0                     7.4
3                        F                     2.0                     9.5
4                        F                     2.1                     7.2
5                        F                     2.1                     7.3
6                        F                     2.1                     7.6
7                        F                     2.1                     8.1
8                        F                     2.1                     8.2
9                        F                     2.1                     8.3
10                       F                     2.1                     8.5

cats 数据集的列名带有特殊字符 ,:。下面,我在进行数据转换。

> # Define the avector-subselection method
> as.data.frame.avector <- as.data.frame.vector
> `[.avector` <- function(x,i,...) {
+   r <- NextMethod("[")
+   mostattributes(r) <- attributes(x)
+   r
+ }

> # Preserve attributes as they are lost due to subet
> test <- data.frame(
+   lapply(cats, function(x) {
+     structure( x, class = c("avector", class(x) ) )
+   } )
+ )

> test
   A.17272..1.MPR.rtn_rslt B.17272..1.MPR.rtn_rslt C.17272..1.MPR.rtn_rslt
1                        F                     2.0                     7.0
2                        F                     2.0                     7.4
3                        F                     2.0                     9.5
4                        F                     2.1                     7.2
5                        F                     2.1                     7.3
6                        F                     2.1                     7.6
7                        F                     2.1                     8.1
8                        F                     2.1                     8.2
9                        F                     2.1                     8.3
10                       F                     2.1                     8.5

上述转换导致新数据 test 来自 cats,将所有特殊字符如 :, 更改为 .

尝试:

test <- data.frame(lapply(cats, function(x) {
        structure(x, class = c("avector", class(x)))
}), check.names = FALSE)

您必须使用引号引用名称,或者在某些情况下使用格式反引号,但重命名整个数据框可能更可取。