我有一个数据集,其中的命名约定很差,我正在努力寻找一种方法来自动执行名称更改过程。数据示例如下所示:
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 (等)列...但出于我的目的,我需要这样的数据。
关于如何编写这个函数有什么建议吗?
最佳答案
我们可以使用 sub
来捕获字母和数字作为一组,并替换为捕获组的反向引用(\\1
)
names(data) <- sub("^([xy]\\d)\\d$", "\\1", names(data))
names(data)
#[1] "x1" "x2" "y" "x1" "x3" "y1" "x2" "x3"
或者删除数字后面的最后一个数字
sub("(?<=\\d)(\\d)$", "", names(data), perl = TRUE)
如果它是一个data.frame
,它不支持重复的列名,因为会使用make.unique
进行检查。但是,如果它是一个矩阵,它可以有重复的列名
如果我们使用 data.frame
调用创建,另一个选择是使用 check.names = FALSE
data <- data.frame(x1, x2, y, x1 = x11, x3, y1, x2 = x21,
x3 = x31, check.names = FALSE)
但是,不建议使用重复的列名,因为这可能会导致提取具有列名的列时出现问题
关于r - R中更改变量名称的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59242150/