【问题标题】:R: Function() - How to check x y values with if else and sapplyR: Function() - 如何使用 if else 和 sapply 检查 x y 值
【发布时间】:2021-08-20 14:38:16
【问题描述】:

这只是我想做的一个例子..我正在尝试检查“Numbers2”是否大于“Numbers”..使用下面的代码..我做错了吗?这是一个小问题,但我是 R 新手。我没有得到我想要的输出,我找不到问题。

df = data.frame(YesNo = c("yes","no","yes","no"), 
            Numbers = c(4, 5, 10, 10),
            Numbers2 = c(5,1,11,11))
df

rownames(df) = c("Test1","Test2","Test3","Test4")
df


improvement1 = function(x,y) {
  if(x >= y){
    return("Improve")
  } else {
    return("No")
  }
}

df$Improvement=sapply(df$Numbers, df$Numbers2, FUN=improvement1)
View(df)

【问题讨论】:

    标签: r function if-statement


    【解决方案1】:

    此问题与 if 相关,它需要一个逻辑值。但是,您正在比较两个向量。我们在您的代码中收到此警告:

    Warning messages:
    1: In if (x >= y) { :
      the condition has length > 1 and only the first element will be used
    

    由于只使用了第一个元素,您会得到意想不到的结果。您需要一个矢量化解决方案,即ifelse()

    improvement1 = function(x,y) {
      ifelse(x >= y, "Improve", "No")
    }
    
    df$Improvement = improvement1(df$Numbers, df$Numbers2)
    df
          YesNo Numbers Numbers2 Improvement
    Test1   yes       4        5          No
    Test2    no       5        1     Improve
    Test3   yes      10       11          No
    Test4    no      10       11          No
    

    【讨论】:

    • 还要注意sapply() 是这里的一个问题。由于您输入了两个向量,sapply() 将返回一个 2x2 矩阵。
    • 即使使用 ifelse,它仍然显示错误的输出对吗?在上面的代码中.. 它没有显示 Test1 和 Test2 的正确输出
    【解决方案2】:

    > 比较器是矢量化的,你根本不需要 for 循环。

    df$Improvement<-c('NO', 'Improve')[1 + (df$Numbers > df$Numbers2)]
    
    #Or just use ifelse as in @Ben Norris' answer:
    
    df$Improvement=ifelse(Numbers>Numers2, 'Improvement', 'No')
    

    如果你真的想使用循环函数,你应该使用mapply(),如:

    df$Improvement=mapply(FUN=improvement1, df$Numbers, df$Numbers2)
    

    mapply 循环遍历多个向量输入元素。 当我们调用mapply(my_function, x, y) 时,输出是c(my_function(x[[1]], y[[1]]), my_function(x[[2]], y[[2]]), .....) 这似乎是你想要的

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      相关资源
      最近更新 更多