R - 使用if语句编写函数以返回二进制输出

时间:2016-07-22 04:03:09

标签: r

美好的一天,

我是初学者,并试图理解为什么我会收到以下错误。

我正在尝试根据数据集中的列值创建一个返回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    将使用第一个元素> }错误:意外'}'在"}"

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

代码中有几个错误:

  1. R区分大小写。使用for代替For
  2. 如果要循环df$Lost.time中的条目,则应使用df$Lost.time[i]在循环内处理各个元素。但是,此任务不需要循环。
  3. else语句不应该从代码的新行开始。在第一个块之后,解析器无法知道if语句未完成。如果else语句包含在} else {中的花括号中,那么就没有问题。
  4. 传递给函数的参数不合适。也许您可以通过df而不是Lost.time,但可能需要重写部分功能。
  5. 1:dim(df)循环中使用for应该有效,但会触发警告消息。最好使用1:nrow(df)
  6. 这些是语法问题。但是,主要问题可能是@TimBiegeleisen在答案中解决的问题:在循环中,您正在检查nrow(df) df$Lost.time个元素中是否满足特定条件。因此,将单个二进制结果作为返回值似乎没有意义。该函数的目的应在实现之前澄清。

    此函数的替代方法可以使用ifelse一行构建。

答案 2 :(得分:0)

如果循环用于写入函数,则应为每个元素使用索引。 在数据框中创建一个变量(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
        }
    }
}