在dplyr中,如何删除和重命名不存在的列,操作所有名称,并使用字符串命名新变量?

Posted

技术标签:

【中文标题】在dplyr中,如何删除和重命名不存在的列,操作所有名称,并使用字符串命名新变量?【英文标题】:In dplyr, how to delete and rename columns that don't exist, manipulate all names, and name a new variable using a string? 【发布时间】:2015-03-08 02:05:19 【问题描述】:

如何使用dplyr 简化或执行以下操作:

    对所有 data.frame 名称运行函数,例如 mutate_each(funs()) 用于值,例如

    names(iris) <- make.names(names(iris))
    

    删除不存在的列(即不删除任何内容),例如

    iris %>% select(-matches("Width")) # ok
    iris %>% select(-matches("X"))     # returns empty data.frame, why?
    

    按名称(字符串)添加新列,例如

    iris %>% mutate_("newcol" = 0) # ok
    
    x <- "newcol"
    iris %>% mutate_(x = 0) # adds a column with name "x" instead of "newcol"
    

    重命名一个不存在的data.frame colname

    names(iris)[names(iris)=="X"] <- "Y"
    
    iris %>% rename(sl=Sepal.Length) # ok
    iris %>% rename(Y=X)             # error, instead of no change
    

【问题讨论】:

第三个为什么不呢? iris %&gt;% mutate_( 'x' = 0) @BondedDust,添加一个名为“x”的列,而他们希望将其命名为“newcol”或存储 n x 的任何名称。 x &lt;- "Sepal.Length"; iris %&gt;% rename_(.dots = setNames(x,"sl")) 有效,但不能用于 (4),因为缺少 colnames 会引发错误 看起来 iris %>% select(-matches("X")) 现在返回完整的 iris data.frame。不再需要下面答案中的一切参数。 【参考方案1】:
    我会为此使用 setNames:

iris %&gt;% setNames(make.names(names(.)))
    包括everything() 作为select 的参数:

iris %>% select(-matches("Width"), everything())
iris %>% select(-matches("X"), everything())
    据我了解,除了像您已经做的那样明确命名字符串之外,没有其他捷径:

iris %&gt;% mutate_("newcol" = 0)

【讨论】:

非常感谢!也许有人看到了 3 的方法,但我将其标记为已解决! dplyr 0.5.0 的工作方式似乎略有不同; Everything() 参数将重新添加列“宽度”。0.5.0 的语法应该是:iris %&gt;% select(-matches("Width"))【参考方案2】:

我为 #4 提出了以下解决方案:

iris %>% 
  rename_at(vars(everything()), 
            function(nm)
              recode(nm, 
                     Sepal.Length="sl",
                     Sepal.Width = "sw",
                     X = "Y")) %>%
  head()

最后一行当然只是为了方便输出。

【讨论】:

【参考方案3】:

上面回答了 1 到 3。我来到这里是因为我遇到了与 4 号相同的问题。这是我的解决方案:

df <- iris

使用要重命名的列和新值设置名称键:

name_key <- c(
  sl = "Sepal.Length",
  sw = "Sepal.Width",
  Y = "X"
)

将不在数据框中的值设置为 NA。这更适合我的目的。您可以将其从 name_key 中删除。

for (var in names(name_key)) 
  if (!(name_key[[var]] %in% names(df))) 
    name_key[var] <- NA
  

获取数据框中列名的向量。

cols <- names(name_key[!is.na(name_key)])

重命名列

for (nm in names(name_key)) 
  names(df)[names(df) == name_key[[nm]]] <- nm

选择列

df2 <- df %>%
  select(cols)

我几乎肯定这可以更优雅地完成,但这是我目前所拥有的。希望这对您有所帮助,如果您还没有解决它!

【讨论】:

name_key &lt;- name_key[name_key %in% names(df)] 删除 name_key 中不属于 df 列的条目。然后您可以将!!select()rename() 一起使用,如下所示:dplyr::select(df, !!name_key)【参考方案4】:

问题 n.2 的答案:

如果您想明确给出列的全名,可以使用函数any_of

iris %>% 
    select(-any_of(c("X", "Sepal.Width","Petal.Width")))

这不会删除不存在的 X 列,而是会删除列出的其他两个。

否则,您可以使用matchesany_ofmatches 组合的解决方案。

  iris %>% 
    select(-any_of("X")) %>% 
    select(-matches("Width"))

这将明确删除 X 和匹配项。多个匹配也是可能的。

iris %>% 
    select(-any_of("X")) %>%
    select(-matches(c("Width", "Spec"))) # use c for multiple matches

【讨论】:

以上是关于在dplyr中,如何删除和重命名不存在的列,操作所有名称,并使用字符串命名新变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中删除和重命名文件?

重命名 dplyr 中的列时的整洁评估

在github中移动和重命名文件

r 使用dplyr重命名R中的列

如何在 Linux 中批量移动复制追加和重命名文件

在工作区中查找和重命名变量(如果存在任何名称)