使用dplyr :: mutate()创建新变量而不会引起名称冲突

时间:2019-08-08 20:29:14

标签: r dplyr

我正在编写一系列内部使用dplyr来处理数据的函数。

在很多地方,我想在使用数据集时将新变量添加到数据集。但是,由于我不知道要传递的数据集中的内容,因此我不确定如何命名这些新变量,以避免覆盖数据中已有的变量。

在基本R中,我可以这样做:

df <- data.frame(a = 1:5)

df[, ncol(df)+1] <- 6:10

,它将为新添加的变量选择一个不与任何现有名称冲突的名称。我想在dplyr中执行此操作,而不是破坏dplyr的一致应用以返回至base-R。

到目前为止,我想到的所有解决方案都非常笨拙,或者无论如何都需要使用一堆base-R融合,这并不比在base-R中添加变量更好。

  1. 重命名所有变量,以便我知道名称是什么
  2. 拉出names()向量,并使用多种方法之一生成不在向量中的名称
  3. 如果用户的数据中恰好有我的内部变量名(错误做法,奥运会!),就会提示错误

dplyr中有直接的方法吗?尽管我认为mutatebind_cols也可以,但最好在tibble::add_column中使用它。

我尝试过的某些方法不起作用:

df <- data.frame(a = 1:5)

# Gives the new variable a fixed title which might already be in there
df %>% mutate(6:10)
df %>% tibble::add_column(6:10)
df %>% mutate(NULL = 6:10)

# Error
df %>% bind_cols(6:10)
df %>% mutate( = 6:10)
df %>% mutate(!!NULL := 6:10)

# And an example of the kind of function I'm looking at:
# This function returns the original data arranged in a random order
# and also the random variable used to arrange it
arrange_random <- function(df) {
  df <- df %>%
    mutate(randomorder = runif(n())) %>%
    arrange(randomorder)

  return(df)
}

# No naming conflict, no problem!
data <- data.frame(a = 1:5)
arrange_random(data)

# Uh-oh, the original data gets lost!
data <- data.frame(randomorder = 1:5)
arrange_random(data)

1 个答案:

答案 0 :(得分:2)

我现在正在发布此解决方案。这听起来像是不太了解自己的数据的情况,因此我认为一种好的方法是在函数中包含const username = req.body.username; const refreshToken = req.body.refreshToken; User.forge({ username: username }) .fetch({ require: true }) .then((user) => user.save({ refreshToken : refreshToken })) .catch((error) => return res.json({message: error.message})) 语句。逻辑是用户选择一些任意的新名称作为后缀添加到其原始变量名称中,但是如果新名称已包含在原始数据中,则该函数将返回错误。否则,该函数将运行并返回原始数据以及新突变的数据。

if-else