【问题标题】:Changing column names in dataframe using gsub使用 gsub 更改数据框中的列名
【发布时间】:2016-10-20 21:12:28
【问题描述】:

我有一个原子向量,例如:

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 更精美地完成此操作。谢谢。

【问题讨论】:

  • 你可能不想要gsub。既然你有一个字典列表,你可能最好使用像regmatches 这样的提取函数。但我有一种感觉,包 stringi(或其包装器 stringr)最适合这个,因为它对所有参数进行了矢量化。
  • 你应该更加努力gsub('(?&lt;=^|_)([a-z])', '\\U\\1', gsub(sprintf('(?i)(?&lt;=%s)(?=.{2,})', paste(list_of_words, collapse = '|')), '_', tolower(col_names_to_be_changed), perl = TRUE), perl = TRUE)
  • @rawr 效果很好。你能把它变成一个解决方案,以便其他人将来可以使用它吗?第一个gsub 确实完成了gsub(sprintf('(?i)(?&lt;=%s)(?=.{2,})', paste(list_of_words, collapse = '|')), '_', tolower(col_names_to_be_changed), perl = TRUE) 的任务,然后另一个gsub 将第一个字母大写。谢谢。
  • 不适用于首字母缩略词(RPM 更改为 Rpm)并且没有“后跟至少两个字母”部分,它将在“日期”中拆分“at”(因为“at”在列表)所以这不是一个很好的解决方案
  • 绝对够用了,比我希望的要好得多,不知道有没有其他办法不手动让它工作。

标签: r regex dataframe gsub


【解决方案1】:

您可以查看单词列表并粘贴它们((?&lt;=))。我添加了(?=.{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"                    

【讨论】:

  • 有没有办法保留列表中的单词c("rpm", "egt")?虽然在这里我没有"egt",但在我的数据中我有它。或者我们可以将它们转换回资本?
  • @bikhaab 也是蛮力的,您可以使用与上述类似的方法pat &lt;- sprintf('(?i)(%s)', paste(cap_list, collapse = '|')); gsub(pat, '\\U\\1', tolower(col_names_to_be_changed), perl = TRUE)
猜你喜欢
  • 2017-08-14
  • 1970-01-01
  • 2016-02-07
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
相关资源
最近更新 更多