【问题标题】:Conditional renaming of data frame columns数据框列的条件重命名
【发布时间】:2017-06-24 18:45:21
【问题描述】:

我有 (1) 一个包含许多列的数据框 (df),(2) 一个字符向量,其元素可能是也可能不是数据框列的名称 (search_for_these),以及 (3)如果数据框包含指定的列 (replace_with_these),则包含应替换上述向量的每个元素的字符串的字符。

df <- data.frame(
  dat = rep(1:2),
  bat = seq(1:2),
  cat = c("foo","bar"))

search_for_these <- c("dat", "bat", "shoe", "box")
replace_with_these <- c("cow", "bat2", "shoes", "boxes")

我的目标是将在colnames(df) 中找到的search_for_these 的任何元素替换为在replace_with_these 的同一索引中找到的值。因此,期望的结果是:

df <- data.frame(
  cow = rep(1:2),
  bat2 = seq(1:2),
  cat = c("foo","bar"))

我想过为此使用dplyr::contains(),但不清楚如何实际实现。

【问题讨论】:

    标签: r string dplyr rename


    【解决方案1】:

    我们可以通过match 做到这一点

    i1 <- match(colnames(df), search_for_these, nomatch = 0)
    colnames(df)[i1] <- replace_with_these[i1]
    

    【讨论】:

    • 简单、透明!
    • 当我用我的实际数据实现它时,我发现 colnames(df)[i1] 包含在 [i1] 中的索引处找到的变量。这些不一定与需要替换的列名的索引相同。换句话说,colnames(df)[i1] 显示了错误的变量,因为 [i1] 是 向量 的索引。所以,colnames(df)[i1]
    • 我也花了一秒钟才看到,但是如果示例数据框中的列名之一 df 在 search_for_these / replace_with_these 中的索引大于df 中的列数。例如,在运行此答案之前,将第一列名称替换为 colnames(df)[1]
    • @akrun 我在一个项目中实现了这个,但它抛出了一个错误。然后我注意到上面 QuestionAnswer 的评论和 QuestionAnswer 的新答案。也许 QuestionAnswer 应该请求编辑而不是创建答案。问题:i1 不是 colnames(df) 的正确索引。更改查找表顺序 - search_for_these
    【解决方案2】:

    虽然我们可以使用match,但我们需要确保替换初始数据框中匹配的元素,而不是替换可能引用主数据框中不同变量的匹配向量的索引!

    正如 akrun 所说,我们首先 match,然后我们使用子集 []%in% 替换包含匹配项的主向量的元素:

    found <- match(colnames(df), search_for_these, nomatch = 0)
    colnames(df)[colnames(df) %in% search_for_these] <- replace_with_these[found]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-15
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      相关资源
      最近更新 更多