我试图了解如何将数据帧传递给R函数。我在StackOverflow上找到了这个问题的答案,它提供了以下演示/ solution:
Pass a data.frame column name to a function
df <- data.frame(A=1:10, B=2:11, C=3:12)
fun1 <- function(x, column){
max(x[,column])
}
fun1(df, "B")
fun1(df, c("B","A"))
这对我有意义,但我不会理解在函数中调用数据帧的规则。请看以下示例:
data(iris)
x.test <- function(df, x){
out <- with(df, mean(x))
return(out)
}
x.test(iris, "Sepal.Length")
此输出为NA,并带有警告消息。但是,如果我在没有该功能的情况下执行相同的程序,它似乎工作正常。
with(iris, mean(Sepal.Length))
我显然在这里遗漏了一些东西 - 非常感谢任何帮助。
谢谢!
答案 0 :(得分:1)
您已经获得了正确的建议(使用&#34; [&#34;或&#34; [[&#34;而不是with
内部功能)但它也可能有助于思考问题发生的原因。在with
内,您要求mean
函数返回字符向量的均值,因此NA就是结果。当你在交互级别使用时,你在列的字符名称周围没有引号,如果你有,你会得到相同的结果:
> with(iris, mean('Sepal.Length'))
[1] NA
Warning message:
In mean.default("Sepal.Length") :
argument is not numeric or logical: returning NA
如果您使用R get
机制进行&#34;促销&#34;一个字符对象,用于返回实际上已经成功的命名对象的结果,尽管通常不推荐with
用于编程:
x.test <- function(df, x){
out <- with(df, mean( get(x)) ) # get() retrieves the named object from the workspace
return(out)
}
x.test(iris, "Sepal.Length")
#[1] 5.843333
请参阅?with
页面的“详细信息”部分,了解有关其在函数中使用的警告。
答案 1 :(得分:0)
这将有效
data(iris)
x.test <- function(df, x){
out <- mean(df[, x])
return(out)
}
x.test(iris, "Sepal.Length")
您的代码正在尝试mean("Sepal.Length")
,这显然不是您想要的。