为了账号安全,请及时绑定邮箱和手机立即绑定

将data.framework列名传递给函数

将data.framework列名传递给函数

holdtom 2019-06-18 16:52:44
将data.framework列名传递给函数我试图编写一个函数来接受data.framework(x)和column从那里。函数在x上执行一些计算,然后返回另一个data.framework。我坚持使用最佳实践方法将列名传递给函数。两个极小例子fun1和fun2下面生成所需的结果,能够在x$column,使用max()举个例子。然而,两者都依赖于表面上(至少对我来说)不雅的东西。打电话给substitute()也有可能eval()需要将列名作为字符向量传递。fun1 <- function(x, column){   do.call("max", list(substitute(x[a], list(a = column))))}fun2 <- function(x, column){   max(eval((substitute(x[a], list(a = column)))))}df <- data.frame(B = rnorm(10))fun1(df, "B")fun2(df, "B")我希望能够将这个函数称为fun(df, B)例如。我已考虑但尚未尝试的其他选择:经过,穿过column作为列号的整数。我想这样可以避免substitute()..理想情况下,该函数可以接受任何一个。with(x, get(column)),但是,即使它有效,我认为这仍然需要substitute利用formula()和match.call()这两个我都没有太多的经验。子问题*是do.call()优先于eval()?
查看完整描述

3 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

您可以直接使用列名:

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"))

没有必要使用替代物,val等。

您甚至可以将所需的函数作为参数传递:

fun1 <- function(x, column, fn) {
  fn(x[,column])}fun1(df, "B", max)

或者,使用[[还可以一次选择一个列:

df <- data.frame(A=1:10, B=2:11, C=3:12)fun1 <- function(x, column){
  max(x[[column]])}fun1(df, "B")


查看完整回答
反对 回复 2019-06-18
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

就我个人而言,我认为将列作为字符串传递是非常丑陋的。我喜欢做这样的事情:

get.max <- function(column,data=NULL){
    column<-eval(substitute(column),data, parent.frame())
    max(column)}

这将产生:

> get.max(mpg,mtcars)[1] 33.9> get.max(c(1,2,3,4,5))[1] 5

请注意data.framework的规范是如何可选的。您甚至可以使用列的函数:

> get.max(1/mpg,mtcars)[1] 0.09615385


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 356 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信