我有一系列代码,它们根据另一列的内容替换现有列的内容(即我创建了一个分类变量,其中'cut'函数不适用)。我是R的新手,想要编写一个函数,在所有data.frames上执行此任务,而不必每次都插入和自定义50行代码。
X是数据框,Y是分类变量,Z是另一个(字符串)变量。此代码有效:
d.f$loc <- ""
d.f <- transform(d.f, loc=ifelse(county=="Alameda",20,""))
# ... and so on
例如我做:
loc
现在,我想针对多个数据框和不同的列而不是county
和ab<-function(Y,Z,env=X) {
env$Y<-transform(env,Y=ifelse(Z=="Alameda",20,""))
...
}
abc<-function(X,Y,Z) {
X<-transform(X,Y=ifelse(Z=="Alameda",20,""))
...
}
执行此操作。
但是,这些功能都不会产生预期的结果:
end=
这两个函数都可以正常运行,但不会以任何方式更改数据框X.我在调用环境或在另一个函数中使用函数时做错了吗?这似乎是一个简单的问题,如果我还没有花5个多小时试图学习这个,我就不会发帖。提前谢谢!
答案 0 :(得分:2)
R对所有对象使用“按值调用” 。只有返回值返回到调用环境。 parameter passing mechanism in R
你可以做到
ab <- function(X, Y, Z) {
X <- transform(X, Y=ifelse(Z=="Alameda",20,""))
...
return(X)
}
如果您的数据框位于列表L
中,则可以lapply(L, ab)
或最终lapply(L, ab, Y=..., Z=...)
结果,您将获得修改后的数据框列表。顺便说一句:还要查看with()
和within()
,例如X$Y <- with(X, ifelse(Z=="Alameda",20,""))
不需要显式调用return(...)
- 你可以隐式调用,即使用函数返回其最后计算表达式的值的问题:
ab <- function(X, Y, Z) {
X <- transform(X, Y=ifelse(Z=="Alameda",20,""))
...
X ### <<<<< last expression
}
以下是如何根据您的情况执行此操作的示例:
ab <- function(X, Y, Z) {
X[, Y] <- ifelse(X[,Z]>12,20,99)
# ...
X ### <<<<< last expression
}
B <- BOD # BOD is one of the dataframes which come with R
ab(B, "loc", "demand")