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

时间:2015-01-09 17:21:36

标签: r dataframe dplyr

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

  1. 对所有data.frame名称运行一个函数,例如mutate_each(funs())的值,例如

    names(iris) <- make.names(names(iris))
    
  2. 删除不存在的列(即不删除任何内容),例如

    iris %>% select(-matches("Width")) # ok
    iris %>% select(-matches("X"))     # returns empty data.frame, why?
    
  3. 按名称(字符串)添加新列,例如

    iris %>% mutate_("newcol" = 0) # ok
    
    x <- "newcol"
    iris %>% mutate_(x = 0) # adds a column with name "x" instead of "newcol"
    
  4. 重命名不存在的data.frame colname

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

4 个答案:

答案 0 :(得分:10)

  1. 我会使用setNames:
  2. iris %>% setNames(make.names(names(.)))

    1. 包括everything()作为select的参数:
    2. iris %>% select(-matches("Width"), everything())
      iris %>% select(-matches("X"), everything())

      1. 根据我的理解,除了明确命名字符串之外别无其他捷径:
      2. iris %>% mutate_("newcol" = 0)

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

上面回答了

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)

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

答案 3 :(得分:1)

问题 n.2 的答案:

如果您想明确给出列的全名,可以使用函数 /app/src/pages

any_of

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

否则,您对 iris %>% select(-any_of(c("X", "Sepal.Width","Petal.Width"))) matchesany_of 组合的解决方案很满意。

matches

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

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