我是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
}
}
答案 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