使用 gsub 更改数据框中的列名
Changing column names in dataframe using gsub
我有一个像这样的原子向量:
col_names_to_be_changed <- c("PRODUCTIONDATE", "SPEEDRPM", "PERCENTLOADATCURRENTSPEED", sprintf("SENSOR%02d", 1:18))
我希望单词之间有 _
,将它们全部小写,单词的首字母除外(在 R Style for dataframes from advanced R 之后)。我想要这样的东西:
new_col_names <- c("Production_Date", "Percent_Load_At_Current_Speed", sprintf("Sensor_%02d", 1:18))
假设我的话仅限于此列表:
list_of_words <- c('production', 'speed', 'percent', 'load', 'at', 'current', 'sensor')
我正在考虑一种使用 gsub
的算法,将 _
放在上面列表中找到单词的任何位置,然后将每个单词的首字母大写。虽然我可以手动执行此操作,但我想了解如何使用 gsub
更漂亮地完成此操作。谢谢。
您可以获取单词列表并将它们粘贴到后面 ((?<=)
)。我添加了 (?=.{2,})
因为这也将匹配 "DATE" 中的 "AT" 因为 "AT" 在单词列表中,所以单词列表中的任何内容都需要后跟 2 个或更多字符,用下划线分隔。
第二个gsub
只是大写
list_of_words <- c('production', 'speed', 'percent', 'load', 'at', 'current', 'sensor')
col_names_to_be_changed <- c("PRODUCTIONDATE", "SPEEDRPM", "PERCENTLOADATCURRENTSPEED", sprintf("SENSOR%02d", 1:18))
(pattern <- sprintf('(?i)(?<=%s)(?=.{2,})', paste(list_of_words, collapse = '|')))
# [1] "(?i)(?<=production|speed|percent|load|at|current|sensor)(?=.{2,})"
(split_words <- gsub(pattern, '_', tolower(col_names_to_be_changed), perl = TRUE))
# [1] "production_date" "speed_rpm" "percent_load_at_current_speed"
# [4] "sensor_01" "sensor_02" "sensor_03"
gsub('(?<=^|_)([a-z])', '\U\1', split_words, perl = TRUE)
# [1] "Production_Date" "Speed_Rpm" "Percent_Load_At_Current_Speed"
# [4] "Sensor_01" "Sensor_02" "Sensor_03"
我有一个像这样的原子向量:
col_names_to_be_changed <- c("PRODUCTIONDATE", "SPEEDRPM", "PERCENTLOADATCURRENTSPEED", sprintf("SENSOR%02d", 1:18))
我希望单词之间有 _
,将它们全部小写,单词的首字母除外(在 R Style for dataframes from advanced R 之后)。我想要这样的东西:
new_col_names <- c("Production_Date", "Percent_Load_At_Current_Speed", sprintf("Sensor_%02d", 1:18))
假设我的话仅限于此列表:
list_of_words <- c('production', 'speed', 'percent', 'load', 'at', 'current', 'sensor')
我正在考虑一种使用 gsub
的算法,将 _
放在上面列表中找到单词的任何位置,然后将每个单词的首字母大写。虽然我可以手动执行此操作,但我想了解如何使用 gsub
更漂亮地完成此操作。谢谢。
您可以获取单词列表并将它们粘贴到后面 ((?<=)
)。我添加了 (?=.{2,})
因为这也将匹配 "DATE" 中的 "AT" 因为 "AT" 在单词列表中,所以单词列表中的任何内容都需要后跟 2 个或更多字符,用下划线分隔。
第二个gsub
只是大写
list_of_words <- c('production', 'speed', 'percent', 'load', 'at', 'current', 'sensor')
col_names_to_be_changed <- c("PRODUCTIONDATE", "SPEEDRPM", "PERCENTLOADATCURRENTSPEED", sprintf("SENSOR%02d", 1:18))
(pattern <- sprintf('(?i)(?<=%s)(?=.{2,})', paste(list_of_words, collapse = '|')))
# [1] "(?i)(?<=production|speed|percent|load|at|current|sensor)(?=.{2,})"
(split_words <- gsub(pattern, '_', tolower(col_names_to_be_changed), perl = TRUE))
# [1] "production_date" "speed_rpm" "percent_load_at_current_speed"
# [4] "sensor_01" "sensor_02" "sensor_03"
gsub('(?<=^|_)([a-z])', '\U\1', split_words, perl = TRUE)
# [1] "Production_Date" "Speed_Rpm" "Percent_Load_At_Current_Speed"
# [4] "Sensor_01" "Sensor_02" "Sensor_03"