不使用列名

时间:2017-10-06 13:20:04

标签: r dataframe dplyr rename

我想创建一个函数,将列中的特定值重命名为其他东西,由函数指定,类似于此(虽然实际上还有更多要重命名):

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>

1 个答案:

答案 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)。这可以使用多个参数以及参数向量,如结果中所示。