【问题标题】:Loops with if statements classifying numbers [duplicate]带有if语句的循环对数字进行分类[重复]
【发布时间】:2014-03-04 16:09:51
【问题描述】:

我在创建循环时遇到问题。我的意图是循环将看到一个值落在哪里并给这个值另一个名字。这是我正在尝试做的一个示例:

a<-rnorm(10,0,1)
b<-rnorm(10,0,1)

testing<-data.frame(a,b)

testing2<-testing
for (i in 1:nrow(testing2)){
  for (j in 1:ncol(testing2)){
    if (testing2[i,j]>1) testing2[i,j]<-"More"
    else if (testing2[i,j]<(-1)) testing2[i,j]<-"Less"
    else testing2[i,j]<-"Same"
  }
}

当我查看 testing2 并将其与 testing 进行比较时,它与它应该做的不匹配。 “更多”似乎有效,但它在“更少”和“相同”之间混淆了。

【问题讨论】:

    标签: r loops if-statement


    【解决方案1】:

    不需要(嵌套)循环,而是使用矢量化的ifelse

    testing = ifelse(testing > 1, 'More', ifelse(testing < -1, 'Less', 'Same'))
    

    【讨论】:

      【解决方案2】:

      cut 显然是这里的候选人。由于需要跨多个列应用,可以使用lapply,如下:

      x <- testing
      x[] <- lapply(testing, cut, breaks=c(-Inf, -1, 1, Inf), 
                    labels=c("less", "same", "more"))
      x
      

      ^^编辑了来自 cmets 的改进 ;-)

      或者用as.matrix代替lapply...

      x <- cut(as.matrix(testing), c(-Inf, -1, 1, Inf), 
               labels=c("less", "same", "more"))
      dim(x) <- dim(testing)
      

      【讨论】:

      • +1 击败了我,虽然我打算使用更紧凑的 lapply(testing, cut, breaks=c(-Inf, -1, 1, Inf), labels=c("less", "same", "more"))
      • @MatthewPlourde,我需要改掉不必要的匿名函数的习惯 :-)
      • 存在更糟糕的习惯。我喜欢你对x[] 的使用,我从来没有想过。
      • cut 是我缺少的函数,因此最终得到了(可怕的)嵌套ifelse。非常好。除了 Matthew 关于不必要的 lambda 的评论之外,我只想补充一点,赋值 (A &lt;- …) 也是不必要的。
      • @KonradRudolph,哈!那是我最初在想factor 是否会在我记得cut 之前工作的遗物。哎呀。
      【解决方案3】:

      正如建议的那样,有更好的方法可以做到这一点。但是回到你的代码,你把character分配给numeric类型搞砸了。

      在 R data.frame 中,列具有相同的类型。因此,一旦您分配了一个字符,整个列类型就变成了字符。

      您可以通过在 for 循环前后调用 sapply(testing2, class) 来验证这一点

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-15
        • 2014-02-19
        • 2016-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-28
        相关资源
        最近更新 更多