删除变量名称中除最后一个下划线 (_) 之外的所有实例

问题描述 投票:0回答:1

我想从数据框中的变量名称中删除下划线 _ 的最终实例

例如,我当前的数据框如下所示:

structure(list(subjectID = c("P1", "P2", "P3", "P4", "P5"), var_t1_new_3m = c(1, 
3, 5, 2, 1), var_t1_old_3m = c(6, 8, 9, 2, 3), var_t2_new_6m = c(1, 
5, 8, 9, 3), var_t2_old_6m = c(5, 3, 8, 1, 7), var_t3_new_12m = c(1, 
9, 2, 7, 3), var_t3_old_12m = c(6, 1, 4, 9, 3)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -5L))

我希望变量名称看起来像这样:

structure(list(subjectID = c("P1", "P2", "P3", "P4", "P5"), vart1new_3m = c(1, 
3, 5, 2, 1), vart1old_3m = c(6, 8, 9, 2, 3), vart2new_6m = c(1, 
5, 8, 9, 3), vart2old_6m = c(5, 3, 8, 1, 7), var3new_12m = c(1, 
9, 2, 7, 3), var3old_12m = c(6, 1, 4, 9, 3)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -5L))

我尝试使用上一篇文章中的解决方案(如何删除模式之前出现的所有下划线?)使用 str_replace 来查看它是否可以解决问题:

x <- c("age_eeg_3m, age_eeg_6m, age_eeg_12m")
str_replace_all(x, "(.*)(?=_[:digit:]m)", \(x) str_remove_all(x, fixed("_")))

这导致了...

[1] "ageeeg3m, ageeeg_6m, age_eeg_12m"

它适用于前两个元素,但不适用于最后一个元素,因为最后一个 _ 和“m”之间有两个数字。

理想情况下,我想避免使用最后 _ 之后的字符作为“模式”(即 _3m / _6m ? 12m)。这样我就可以将代码应用于任何具有多个下划线的变量名称。

r string
1个回答
0
投票

这行得通吗?

names(df) <- gsub("_(?=.+_)", "", names(df), perl = TRUE)

cat(names(df), sep = "\n")

# subjectID
# vart1new_3m
# vart1old_3m
# vart2new_6m
# vart2old_6m
# vart3new_12m
# vart3old_12m

数据

df <- data.frame(
  subjectID = character(0),
  vart1new_3m = numeric(0),
  vart1old_3m = numeric(0),
  vart2new_6m = numeric(0),
  vart2old_6m = numeric(0),
  vart3new_12m = numeric(0),
  vart3old_12m = numeric(0)
)
© www.soinside.com 2019 - 2024. All rights reserved.