【问题标题】:keep duplicates using `make_clean_names` in R janitor package在 R janitor 包中使用 `make_clean_names` 保留重复项
【发布时间】:2020-06-26 12:29:01
【问题描述】:

我正在尝试使用 R 中 janitor 包中的 make_clean_names 函数清理字符列。在这种情况下,我需要保留重复项,而不是向其添加数字。这可能吗?我的代码是这样的

x <- c(' x y z', 'xyz', 'x123x', 'xy()','xyz','xyz')

janitor::make_clean_names(x)
[1] "x_y_z" "xyz"   "x123x" "xy"    "xyz_2" "xyz_3"

janitor::make_clean_names(x, unique_sep = '.')
[1] "x_y_z" "xyz"   "x123x" "xy"    "xyz.1" "xyz.2"

janitor::make_clean_names(x, unique_sep = NULL)
[1] "x_y_z" "xyz"   "x123x" "xy"    "xyz_2" "xyz_3"

使用unique_sep = NULL 似乎不起作用。还有其他保持唯一值的方法吗?

期望的输出:

[1] "x_y_z" "xyz"   "x123x" "xy"    "xyz" "xyz"

我知道如何使用正则表达式来做到这一点。只是在寻找捷径。

PS:我知道创建此函数是为了清除 data.frame 的名称,我正在尝试将其应用于不同的用例。此功能可能有助于清理字符列。

【问题讨论】:

  • 很难用相同的变量名进行任何分析。例如,如果你做了mean(df$xyz) R 会选择哪一列?在大多数操作中,如果这些是数据框中的列,它将抛出错误。我建议不要这样做。
  • 正如我所提到的,我正在尝试清理字符列。我没有用来清理数据框的列名。
  • 只是试图将功能重新用于其他用例

标签: r janitor


【解决方案1】:

很遗憾,这不可能。如果您查看make_clean_names 的代码,您会看到它以这样的结尾:

 # Handle duplicated names - they mess up dplyr pipelines.  This appends the
  # column number to repeated instances of duplicate variable names.
  while (any(duplicated(cased_names))) {
    dupe_count <-
      vapply(
        seq_along(cased_names), function(i) {
          sum(cased_names[i] == cased_names[1:i])
        },
        1L
      )
  
    cased_names[dupe_count > 1] <-
      paste(
        cased_names[dupe_count > 1],
        dupe_count[dupe_count > 1],
        sep = "_"
      )
  }

我认为您将unique_sep 参数传递给make_clean_names 使用的底层函数snakecase::to_any_case 是正确的。但是最近引入的while 循环是为了确保从不make_clean_names 产生重复的名称,它总是会在最后进行重复数据删除。

您可以尝试调整自己的函数,即 make_clean_names 的第一部分,不使用循环,或者您可以使用 snakecase::to_any_case

【讨论】:

  • 谢谢。具有此功能的另一个功能对于清理字符和因子列非常有用!这个包很好用。这对我帮助很大!
【解决方案2】:

您可以使用sapply 逐个遍历向量元素,从而避免在重复项中添加数字后缀:

sapply(x, make_clean_names, USE.NAMES = F)
[1] "x_y_z" "xyz"   "x123x" "xy"    "xyz"   "xyz"

【讨论】:

  • 这是一个聪明的解决方案!比我写一个新函数的建议要容易得多。
猜你喜欢
  • 2019-11-19
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 2020-03-16
  • 2015-11-22
  • 1970-01-01
相关资源
最近更新 更多