我正在创建一个循环的麻烦。我的意图是循环将看到值下降的位置并给该值另一个名称。这是我想要做的一个例子:
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并将其与测试进行比较时,它与它应该做的事情不符。 “更多”似乎有效,但它在“少”和“相同”之间混淆。
答案 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)
正如所建议的,有更好的方法可以做到这一点。但回到您的代码,您可以通过分配character
到numeric
类型来解决问题。
在R data.frame
中,列具有相同的类型。因此,一旦指定了字符,整个列类型就会变为字符。
您可以通过在for循环
之前和之后调用sapply(testing2, class)
来验证这一点