【问题标题】:Function not evaluating as expected due to ID10T error由于 ID10T 错误,函数未按预期进行评估
【发布时间】:2017-06-21 17:48:34
【问题描述】:

为简单起见:mydf <- data.frame(college=c(1,2,1,0,3))

> str(mydf)
'data.frame':   5 obs. of  1 variable:
 $ college: num  1 2 1 0 3

我有一堆重复的代码元素,我通过首先分解和设置参考水平来设置进行有序逻辑回归,如下所示:

> mydf$college <- factor(mydf$college)
> relevel(mydf$college, ref="2")
[1] 1 2 1 0 3
Levels: 2 0 1 3
> str(mydf$college)
 Factor w/ 4 levels "0","1","2","3": 2 3 2 1 4

我为此编写了一个函数,这样我就可以调用它并拥有更好的编程礼仪:

factor_level <- function(ds, var, referent){
  ds[[var]] <- factor(ds[[var]])
  ds[[var]] <- relevel(ds[[var]], ref=referent)
}

但是,当我调用该函数时,我没有收到任何错误,但我也没有得到因式分解的结果。

> factor_level(ds = mydf, var="college", referent= "2")
> str(mydf$college)
 num [1:5] 1 2 1 0 3

我确定这是语法,但我无法弄清楚原因。提前致谢。

【问题讨论】:

  • 你在函数内部做的事情不会改变函数外部的任何东西(除非你做了你不应该做的特殊事情)。您的函数需要返回修改后的因子ds,并在调用函数时分配结果。

标签: r function syntax


【解决方案1】:

为了说明 joran 在他的评论中的意思,你的功能应该是

factor_level <- function(var, referent){
  var <- factor(var)
  relevel(var, ref=referent)
}

然后你可以调用:

mydf$college <- factor_level(mydf$college, "2")

我认为在这种情况下使用单独的数据和变量名参数不会有任何好处。只需将向量传递给它。

如果我正确理解了您评论中的问题,则可以将其应用于数据框中的多个向量

mydf [c ("var1", "var2", ..., "varn")] <-
    lapply(mydf [c ("var1", "var2", ..., "varn")],
          factor_level, "2")

【讨论】:

  • 谢谢。我有点困惑。对于两个应用语句来说,这是否是一个更好的地方,我只是对从名称向量创建的索引上的列进行子集化,我想用相同的引用以相同的方式进行更改?
  • 查看我的答案的补充。希望我正确理解了您的问题
  • 啊,我的想法更像是跳过我的功能并执行以下操作:mydf[c("var1","var2"),] &lt;- apply(mydf[c("var1","var2"),], 2, factor),然后是mydf[c("var1","var2"),] &lt;- apply(mydf[c("var1","var2"),], 2, function(x) relevel(x, ref = "2")),但我无法让它工作。
  • 在你的情况下,你最好使用mydf[c("var1","var2"),] &lt;- lapply(mydf[c("var1","var2"),], factor),然后是mydf[c("var1","var2"),] &lt;- lapply(mydf[c("var1","var2"),], function(x) relevel(x, ref = "2"))。我相信apply 将对象强制转换为矩阵,因此在处理数据框的列时最好使用lapply
  • 谢谢。 @Benjamin 在我的示例中,我的行和列是倒着的,但我明白了要点。
【解决方案2】:

问题在于 R 函数不会改变原始输入,除了替换函数,它的行为就像修改原始输入一样。所以你需要这样做:

factor_level <- function(ds, var, referent){
  ds[[var]] <- factor(ds[[var]])
  ds[[var]] <- relevel(ds[[var]], ref=referent)
  ds
}

mydf <- factor_level(ds = mydf, var="college", referent= "2")

或者您需要像这样定义替换函数(如 R 中的 &lt;-[&lt;-):

`factor_level<-` <- function(ds, var, value){
  ds[[var]] <- factor(ds[[var]])
  ds[[var]] <- relevel(ds[[var]], ref=value)
  ds
}

factor_level(mydf, var="college") <- "2"

但是在这种情况下,替换函数的行为很奇怪,我认为你不应该使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 2014-04-15
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多