【问题标题】:R - Writing a function to return binary output using if statementR - 编写一个函数以使用 if 语句返回二进制输出
【发布时间】:2016-07-22 12:57:49
【问题描述】:

早安,

我是一名初学者,并试图了解为什么会出现以下错误。

我正在尝试创建一个函数,该函数将根据数据集中的列值返回 0 或 1。

LT = function(Lost.time) {
    For (i in 1:dim(df)) {
        if (df$Lost.time > 0) {
            x = 1
        }
        else {
            x = 0
        }
        return(x)
    }
}

错误:没有要返回的函数,跳转到顶层另外:警告 消息:在 if (df$Lost.time > 0) { :条件的长度 > 1 并且只有 第一个元素将被使用>}错误:“}”中的意外'}'

【问题讨论】:

    标签: r


    【解决方案1】:

    代码中有几个错误:

    1. R 区分大小写。使用for 而不是For
    2. 如果您循环遍历df$Lost.time 中的条目,则应使用df$Lost.time[i] 在循环内寻址各个元素。但是,此任务不需要循环。
    3. else 语句不应从代码的新行开始。解析器无法知道if 语句在第一个块之后没有完成。如果else 语句像} else { 那样用花括号括起来,那么在这个意义上不会有问题。
    4. 传递给函数的参数不合适。也许您可以传递df,而不是Lost.time,但可能需要重写部分函数。
    5. for 循环中使用1:dim(df) 应该可以工作,但会触发警告消息。最好使用1:nrow(df)

    这些是语法问题。但是,主要问题可能是@TimBiegeleisen 在回答中解决的问题:在循环中,您正在检查df$Lost.time 的每个̀nrow(df) 元素是否满足特定条件。因此,将单个二进制结果作为返回值似乎没有意义。在实现之前,应该明确功能的用途。

    可以使用ifelse 在单行中构造此函数的替代方法。

    【讨论】:

    • +1。但是你能详细说明第 3 点,else 周围的花括号吗?当我开始使用 R(以及一般编程)时,我犯了与 OP 相同的错误(即没有将括号和 else 放在同一行)。但是,我注意到当我在循环中执行此操作时,它大部分时间都有效。但是当它是一个“独立的”else-statement 时,它从来没有工作过。我有一段时间没有想到它,但现在我很好奇这是怎么可能的。还是我应该用一个可重复的例子提出自己的问题?
    • @Marcel10 感谢您的反馈。抱歉,我无法尽快回复 - 离开了几天。我不经常使用else,当我这样做时,我确保它跟在同一行上前一个块的右花括号之后。不确定这是否是绝对必要的,但“独立”else can 至少有时会导致问题。报告了将else 括在花括号中的建议,例如,在“花括号”部分herehere 中。希望这会有所帮助。
    • 不用担心,我在post 中找到了答案:“R 是一种解释性语言,所以 R 代码是逐行解析的”。 .当ifelse 语句嵌套在一个循环中时,R 可以将它们识别为一个代码块。 “独立”else 给出错误,因为它分别读取 ifelse 语句。
    • 谢谢大家!它按照上述更改工作,非常感谢
    【解决方案2】:

    目前尚不清楚您实际上想要在函数中返回什么。 return 只能被调用一次,之后它会返回一个值并终止函数。

    如果您想获得一个包含 1 或 0 的向量,具体取决于数据框中的给定行是否具有 Lost.time > 0,那么下面的一行应该可以解决问题:

    x <- as.numeric(df$Lost.time > 0)
    

    【讨论】:

    • 看起来 OP 在代码 sn-p 中使用 {0,1} 代替了 {FALSE, TRUE}。然后,可以忽略对as.numeric 的调用。
    • 谢谢大家!它按照上述更改工作,非常感谢
    【解决方案3】:

    如果使用循环来编写函数,则应为每个元素使用索引。 在您的数据框中创建一个变量(x),如果语句为真,则打印 1 else 0

    LT = function(Lost.time) {
        for (i in 1:dim(df)) {
            if (as.numeric(df$Lost.time[i]) > 0) {
                df$x[i] <- 1
            }else{
              df$x[i] <- 0
            }
        }
    }
    

    【讨论】:

    • 代码不起作用。请在发布之前对其进行测试。例如,x 未初始化为向量,因此寻址 x[i] 将不起作用。而不是For,循环应该写成for。废弃的elsestatement 会导致问题...
    • 好的,这样更好;-)
    • @RHertel for 循环在我的测试 data.frame 上运行良好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多