使用函数更改 R 中多个单元格的名称

Change the names of multiple cells in R using a function

考虑以下数据框:

df <- setNames(data.frame(1:5,rep(1,5)), c("id", "value"))

我想更改“id”列中多个单元格的名称。假设我想更改以下内容:

df$id[df$id %In% 2:3] <- 1
df$id[df$id == 4]     <- 3

但是,我不想使用上面的代码,而是想创建一个函数,在这里我可以更“平滑”地进行转换(因为我有很多数据框,我需要在其中更改名称细胞)。我想创建一个函数:

mapping <- function(...) {
  ...
}

之后我可以为我的 df 创建一个简单而流畅的映射函数,我只需要为单元格指定“旧”和“新”名称。像这样:

df_mapping <- function(...) {
  2.1
  3.1
  4.3  
}

然后我可以在我的数据上应用该函数并指定它应该为哪一列执行此操作,它的工作方式与 gsub:

的代码相同
df <- df_mapping(df,id)

是否可以创建该映射函数?

如果我们需要一个函数,那么可以有一个 'data' 参数、列名、要替换的值和替换值,然后创建逻辑条件、子集列、分配 replacer_val 和return赋值后的数据集

f1 <- function(dat, colnm, values_to_replace, replacer_val) {
           dat[[colnm]][dat[[colnm]] %in% values_to_replace] <- replacer_val
         return(dat)
    }

f1(df, "id", c(2, 3), 1)

-输出

#   id value
#1  1     1
#2  1     1
#3  1     1
#4  4     1
#5  5     1

要用相应的替换集替换值,

f2 <- function(dat, colnm, values_to_replace, replacer_vals) {

          nm1 <- setNames(replacer_vals, values_to_replace)
          v1 <- nm1[as.character(dat[[colnm]])]
          i1 <- !is.na(v1)
          dat[[colnm]][i1] <- v1[i1]
        return(dat)
 

    }
     


f2(df, "id", c(2, 3), c(5, 6))
#  id value
#1  1     1
#2  5     1
#3  6     1
#4  4     1
#5  5     1

或者另一种选择是创建一个 key/value 数据集并使用 mergejoin

library(data.table)
f3 <- function(dat, colnm, values_to_replace, replacer_vals) {
        keydat <- data.frame(key = values_to_replace, val = replacer_vals)
       names(keydat)[1] <- colnm
       dt <- as.data.table(dat)
      dt[keydat, (colnm) := val, on = colnm][]
      return(dt)
 }

f3(df, "id", c(2, 5), c(3, 6))

也许下面的 mapping 可以帮助

mapping <- function(df, id, to_replace, obj_value) {
  transform(df, id = replace(id, id %in% to_replace, obj_value))
}

例如,

> mapping(df, id, c(2, 3), 1)
  id value
1  1     1
2  1     1
3  1     1
4  4     1
5  5     1

您可以使用dplyrrecode功能

mapping <- function(data, col, old, new) {
  data[[col]] <- dplyr::recode(data[[col]], !!!setNames(new, old))
  data
}

mapping(df, "id", c(2, 3), c(7L, 8L))

#  id value
#1  1     1
#2  7     1
#3  8     1
#4  4     1
#5  5     1