对于if语句的循环

时间:2014-04-18 04:05:20

标签: r

我是MATLAB用户而且只是R的新用户,我创建了一个包含if语句的for循环。变量"得分10"是一组介于0到10之间的随机数.group是空集合组< - c()。基本上我想要分数。当我运行下面的代码时,变量组给我一个1然后一系列的NA和一个0在第1279条目。我哪里错了?提前致谢

group <- c()
for(i in 1:1279) {
    if (score10[i] <= 4) {
        group[i] = 0
    } else {
        group[i] = 1
    }
}

2 个答案:

答案 0 :(得分:2)

在Ananda Mahto的回答基础上,您也可以使用ifelse

> score <-sample(10, 20, TRUE)
> score
## [1] 10  4  6  3  9  8  1  5  1 10  9  5  2  6 10  2  7 10  5  9
> ifelse(score <= 4, 0, 1)
## [1] 1 0 1 0 1 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1

答案 1 :(得分:1)

在R中有更好的方法可以使用逻辑比较并将其转换为numeric

set.seed(1)
score10 <- sample(10, 20, TRUE)
score10
# [1]  3  4  6 10  3  9 10  7  7  1  3  2  7  4  8  5  8 10  4  8
score10 > 4
# [1] FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE
# [13]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
as.numeric(score10 > 4)
# [1] 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1

如果您想使用for循环方式,请尝试以下方法:

group <- integer(length(score10)) ## Initializes a vector of zeroes
group
#  [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
for (i in seq_along(score10)) {
  if (score10[i] > 4) group[i] <- 1L
}
group
# [1] 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1

为证明我关于&#34;的说法,有更好的方法在R&#34;中执行此操作,这里有一些基准:

set.seed(1)
score10 <- sample(10, 1e5, TRUE)
fun1 <- function() as.numeric(score10 > 4)
fun2 <- function() ifelse(score10 <= 4, 0, 1)
fun3 <- function() {
  group <- integer(length(score10))
  for (i in seq_along(score10)) {
    if (score10[i] > 4) group[i] <- 1L
  }
  group 
}

library(microbenchmark)
microbenchmark(fun1(), fun2(), fun3(), times = 10)
# Unit: milliseconds
#    expr       min         lq     median         uq        max neval
#  fun1()   1.58363   1.597111   1.629187   1.645506   3.259797    10
#  fun2()  46.28590  46.358392  47.935876  48.309711  48.402714    10
#  fun3() 146.12897 149.051372 149.285990 150.827876 153.211941    10

最终更新

&#34;定影&#34;你的for循环还会告诉你为什么你当前的方法,它增长了一个向量而不是预先分配它,是真的坏主意。

fun3b <- function() {
  group <- c()
  for (i in seq_along(score10)) {
    if (score10[i] > 4) {
      group[i] <- 1L
    } else {
      group[i] <- 0L
    }
  }
  group 
}

或者,更简洁,但同样缓慢:

fun3c <- function() {
  group <- c()
  for (i in seq_along(score10)) {
    group[i] <- if (score10[i] > 4) 1L else 0L
  }
  group 
} 

## The "fix"
system.time(fun3b())
#    user  system elapsed 
#  10.171   0.010  10.212 

## The modified version I mentioned earlier
system.time(fun3())
#    user  system elapsed 
#   0.151   0.000   0.155 

## The R way to do things
system.time(fun1())
#    user  system elapsed 
#   0.001   0.000   0.001