我想创建一个函数,将列中的特定值重命名为其他东西,由函数指定,类似于此(虽然实际上还有更多要重命名):
func <- function(x) x %>%
mutate(col_name = ifelse(col_name =="something","something else",
ifelse(col_name == "something2","something_else2")))
请注意,我不想更改列名,而是列中的值本身。但是,无论值在哪一列(例如,函数在整个数据框中都有效),我希望这可以工作。此外,这仅在函数中指定的值存在时才有效,并且我希望它忽略列中不存在的值。这是一个可重复的小例子:(列值是任意的)
col1 <- c("a","b","c","d","e")
col2 <- c("b","f","d","c","g")
df <- data.frame(col1, col2)
col3 <- c("a","h","i","b","c")
col4 <- c("c","d","j","a","g")
df2 <- data.frame(col3, col4)
看起来像这样:
df1:
col1 col2
1 a b
2 b f
3 c d
4 d c
5 e g
df2:
col3 col4
1 a c
2 h d
3 i j
4 b a
5 c g
说我要像这样重命名:
df1:
col1 col2
1 can chi
2 chi pig
3 equ she
4 she equ
5 fox bov
df2:
col3 col4
1 can equ
2 avi she
3 tyr asp
4 chi can
5 equ bov
所以我希望获得的是一个函数,它可以更改数据框列中多个值的名称,而不管它在数据框中的位置,并忽略函数中数据框中找不到的值。 / p>
答案 0 :(得分:1)
customer_group
<强>结果:强>
library(dplyr)
func = function(x, originals = letters[1:10],
rename_tos = c("can", "chi", "equ", "she", "fox", "pig", "bov", "avi", "tyr", "asp")){
names(rename_tos) = originals
x %>%
mutate_if(is.factor, as.character) %>%
lapply(function(y){
y = rename_tos[y]
}) %>%
data.frame(row.names = NULL)
}
备注:强>
我使用的方法基本上是为重命名创建一个查找表(命名向量),并使用列值索引> func(df)
col1 col2
1 can chi
2 chi pig
3 equ she
4 she equ
5 fox bov
> func(df2)
col3 col4
1 can equ
2 avi she
3 tyr asp
4 chi can
5 equ bov
向量。在这里,我将原始设置和重命名设置为该功能的默认设置,但您也可以自己提供。
如果您希望能够重命名指定的列并使其他列保持不变,则可以执行以下操作:
rename_tos
<强>结果:强>
library(dplyr)
library(rlang)
func = function(x, ..., originals = letters[1:10],
rename_tos = c("can", "chi", "equ", "she", "fox", "pig", "bov", "avi", "tyr", "asp")){
names(rename_tos) = originals
dots = quos(...)
x %>%
mutate_at(vars(!!! dots), as.character) %>%
mutate_at(vars(!!! dots), funs(rename_tos[.])) %>%
data.frame(row.names = NULL)
}
备注:强>
在这里,我添加了> func(df, col2)
col1 col2
1 a chi
2 b pig
3 c she
4 d equ
5 e bov
> func(df2, col3, col4)
col3 col4
1 can equ
2 avi she
3 tyr asp
4 chi can
5 equ bov
> func(df2, c(col3, col4))
col3 col4
1 can equ
2 avi she
3 tyr asp
4 chi can
5 equ bov
参数以允许用户输入自己的列名。我使用...
中的quos
来引用rlang
个参数,然后使用...
将vars
内的mutate_at
取消引用至!!!
。例如,如果用户提供了func(df, col2)
,则mutate_at
的第一个参数将计算为vars(col2)
。这可以使用多个参数以及参数向量,如结果中所示。