考虑以下数据帧:
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”参数,则此方法有效。
我们可以使用[[
,将列名作为字符串传递,并在函数中返回数据集
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
,一个选项是通过添加开头(^
)和结尾($
)paste
。另外,如果这种情况仅发生一次,那么我们只需要使用sub
而不是gsub
(全局替换)
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")
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句