用于更改R中变量名称的功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于更改R中变量名称的功能相关的知识,希望对你有一定的参考价值。

我有一个数据集,其中的命名约定很差,我正在努力寻找一种自动执行名称更改过程的方法。数据示例如下所示:

x1 <- rnorm(10)
x2 <- rnorm(10)
y  <- rnorm(10)
x11 <- rnorm(10)
x3 <- rnorm(10)
y1 <- rnorm(10)
x21 <- rnorm(10)
x31 <- rnorm(10)

data <- data.frame(x1, x2, y, x11, x3, y1, x21, x31)
head(data,2)

这将输出如下所示的数据框:

          x1         x2          y        x11          x3         y1
1 -0.9071106  0.6852567  0.7185932 -0.1943458  1.71832739  0.1568951
2 -0.4592129 -0.3567014 -0.3137624  0.9683101 -0.15601160  0.8513820

         x21        x31
1  0.6160399 -1.3877095
2 -1.0286380 -1.6583842

我想做的是将每个x列的名称更改为,将其更改为x旁边出现的第一个数字。例如,x11列应仅读取x1 ...,而x21列应仅读取x2。我可以通过执行以下操作来手动更改每个名称来实现此目的:

names(data)[startsWith(names(data), "y")] <- "y"
names(data)[startsWith(names(data), "x1")] <- "x1"
names(data)[startsWith(names(data), "x2")] <- "x2"
names(data)[startsWith(names(data), "x3")] <- "x3"

head(data,2)

哪个输出:

          x1         x2          y         x1         x3         y
1 -0.9071106  0.6852567  0.7185932 -0.1943458  1.7183274 0.1568951
2 -0.4592129 -0.3567014 -0.3137624  0.9683101 -0.1560116 0.8513820
          x2        x3
1  0.6160399 -1.387709
2 -1.0286380 -1.658384

但是我正在努力编写一个函数来对整个数据集执行此操作。另外,我意识到这将导致具有多个x1,x2(等)列...但是出于我的目的,我需要像这样的数据。

关于id如何编写此功能的任何建议?

答案

我们可以使用sub来捕获字母,后跟数字作为组,并用所捕获组的后向引用(\1代替]

names(data) <- sub("^([xy]\d)\d$", "\1", names(data))
names(data)
#[1] "x1" "x2" "y"  "x1" "x3" "y1" "x2" "x3"

如果为data.frame,将不支持重复的列名,因为对make.unique进行了检查。但是,如果它是matrix,则可以具有重复的列名


如果要通过data.frame调用进行创建,另一个选择是使用check.names = FALSE

data <- data.frame(x1, x2, y, x1 = x11, x3, y1, x2 = x21,
         x3 = x31, check.names = FALSE)

但是,不建议使用重复的列名,因为这可能导致在提取具有列名的列时遇到麻烦

以上是关于用于更改R中变量名称的功能的主要内容,如果未能解决你的问题,请参考以下文章

在 r 中传递变量的“名称”

小程序各种功能代码片段整理---持续更新

如何通过动态单击按钮来更改选项卡标题名称?

如何将字符串附加到R中的变量名子集?

配置更改后片段丢失过渡动画

片段更改崩溃