我正在编写一系列在内部使用 dplyr
来操作数据的函数。
在使用数据集时,我想在很多地方添加新变量。但是,我不知道如何命名这些新变量,以避免覆盖数据中已有的变量,因为我不知道正在传递的数据集中有什么内容。
在基础 R 中我可以这样做:
df <- data.frame(a = 1:5)
df[, ncol(df)+1] <- 6:10
它将为新添加的变量选择一个不与任何现有名称冲突的名称。我想在 dplyr 中执行此操作,而不是破坏 dplyr 的一致应用程序以返回到 base-R。
到目前为止我想到的所有解决方案都感觉非常笨拙,或者无论如何都需要使用一堆base-R fuzzy,这并不比仅仅在base-R中添加变量更好:
- 重命名所有变量,以便我知道名称是什么
- 提取
names()
向量并使用多种方法之一生成向量中没有的名称 - 如果用户的数据中碰巧有我的内部变量名称,则会出错(奥运会的糟糕做法!)
在 dplyr 中是否有直接的方法来执行此操作?让它在 mutate
中工作将是理想的选择,尽管我认为 bind_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)
最佳答案
我现在发布这个解决方案。这听起来像是不太了解自己的数据的情况,所以我认为一个好的方法是在函数中包含一个 if-else
语句。其逻辑是,用户选择一些任意的新名称作为后缀添加到原始变量名称中,但如果新名称已包含在原始数据中,则该函数将返回错误。否则,该函数将运行并返回原始数据以及新变异的数据。
df <- data.frame(a = 1:5, b=11:15, c=21:25)
# define function with if-else statement to catch any possible duplicates
addnew <- function(data,name='newvar'){
if(sum(grepl(name,names(data),ignore.case=T))>0)
{stop('Error! Possible duplicate names with your new variable names')} else{
data1 <- data %>% mutate_all(list( ~ runif(n())))
names(data1) <- paste0(names(data1),'_',name)
bind_cols(data,data1)
}
}
addnew(df,'new')
a b c a_new b_new c_new
1 1 11 21 0.2875775 0.0455565 0.9568333
2 2 12 22 0.7883051 0.5281055 0.4533342
3 3 13 23 0.4089769 0.8924190 0.6775706
4 4 14 24 0.8830174 0.5514350 0.5726334
5 5 15 25 0.9404673 0.4566147 0.1029247
# try with new data that should throw an error
df <- data.frame(a_new = 1:5,b=11:15,c=21:25)
addnew(df,'new')
Error in addnew(df, "new") :
Error! Possible duplicate names with your new variable names
关于r - 使用 dplyr::mutate() 创建新变量而不发生名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57420140/