首页 > 解决方案 > 使用函数更改 R 中的单元格名称

问题描述

考虑以下数据框:

df <- data.frame(rep(1,10),1:10,rep(5,10))

我想用值 2 替换第二列中值 1 的所有单元格。我想创建一个执行此操作的函数。我创建以下函数:

test <- function(x,q,y,z) {
  x$q <- gsub(y, z, x$q)
}

但是当我应用代码时:

df$X1.10 <- test(df,X1.10,"1","2")

我得到一个错误。为什么我会收到错误消息?如果我不在函数中包含“z”参数,它就可以工作。

标签: rfunction

解决方案


我们可以使用[[,将列名作为字符串传递并在函数中返回数据集

test <- function(x,q,y,z) {
    x[[q]] <- gsub(y, z, x[[q]])
    x
  }

test(df, "X1.10", "1", "2")

-输出

#     rep.1..10. X1.10 rep.5..10.
#1           1     2          5
#2           1     2          5
#3           1     3          5
#4           1     4          5
#5           1     5          5
#6           1     6          5
#7           1     7          5
#8           1     8          5
#9           1     9          5
#10          1    20          5

如果我们只需要更改固定匹配项而不更改子字符串,我们不需要 a gsub,它可以只是==创建一个逻辑表达式==并使用它来分配

test <- function(x,q,y,z) {
   i1 <- x[[q]] == y
    x[[q]][i1] <- z
    x
  }

 test(df, "X1.10", "1", "2")
#   rep.1..10. X1.10 rep.5..10.
#1           1     2          5
#2           1     2          5
#3           1     3          5
#4           1     4          5
#5           1     5          5
#6           1     6          5
#7           1     7          5
#8           1     8          5
#9           1     9          5
#10          1    10          5

使用regex,一个选项是通过ing添加开始 ( ^) 和结束 ( )。另外,如果这种情况只发生一次,那么我们只需要使用而不是(全局替换)$pastesubgsub

test <- function(x,q,y,z) {
     y <- paste0("^", y, "$")
    x[[q]] <- sub(y, z, x[[q]])
    x
  }

test(df, "X1.10", "1", "2")

如果我们想传递不带引号的列名,请使用deparse/substitute

test <- function(x,q,y,z) {
    q <- deparse(substitute(q))
    x[[q]] <- gsub(y, z, x[[q]])
    x
  }

test(df, X1.10, "1", "2")

推荐阅读