循环使用if语句对数字进行分类

时间:2014-03-04 16:09:51

标签: r loops if-statement

我正在创建一个循环的麻烦。我的意图是循环将看到值下降的位置并给该值另一个名称。这是我想要做的一个例子:

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并将其与测试进行比较时,它与它应该做的事情不符。 “更多”似乎有效,但它在“少”和“相同”之间混淆。

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

cut在这里作为明显的候选人浮现在脑海中。由于您需要跨多个列应用它,因此您可以使用lapply,如下所示:

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

^^ 使用评论中的改进进行编辑; - )

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

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

答案 2 :(得分:1)

正如所建议的,有更好的方法可以做到这一点。但回到您的代码,您可以通过分配characternumeric类型来解决问题。

在R data.frame中,列具有相同的类型。因此,一旦指定了字符,整个列类型就会变为字符。

您可以通过在for循环

之前和之后调用sapply(testing2, class)来验证这一点