r - 使用函数更改 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”参数,它就可以工作。
解决方案
我们可以使用[[
,将列名作为字符串传递并在函数中返回数据集
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添加开始 ( ^
) 和结束 ( )。另外,如果这种情况只发生一次,那么我们只需要使用而不是(全局替换)$
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")
推荐阅读
- automated-tests - 无法读取未定义的属性“$”
- loops - 为什么这段代码的时间复杂度是 O(n) 而不是 O(log n)
- css - 我怎样才能摆脱表格中每 5 行的边框底部较厚的事实?
- c++ - 为什么 AVR-GCC 编译器在使用相同的变量但作为 PROGMEM 重载时会引发错误?
- java - Android Java 获取所有后台运行的应用程序或服务
- wordpress - 我的 Elementor pro 没有在我的 Genesis 主题上工作
- javascript - 超过 Netlify 部署时间
- android-studio - 后端(JVM)内部错误:无法生成表达式:KtCallExpression
- r - 有没有比 table() 更有效的替代方法?
- java - 如何创建用于查找带有标签的电影的 Hibernate 搜索查询?