如何从R中两个向量的比较生成一个向量?

时间:2014-10-13 17:35:40

标签: r vector

对于作业,我必须创建一个随机向量theta,一个向量p包含theta的每个元素的相关概率,以及另一个随机向量u。到目前为止没有任何问题,但我仍然坚持下面的报告:

如果pi≥ui,则生成位置i为1的向量r1,如果pi

theta=rnorm(1000,0,1)
p=(exp(theta-1))/(1+exp(theta-1))
u=runif(1000,0,1)

我尝试了以下代码,但它不起作用。

r1<-for(i in 1:1000){
if(p[i]<u[i]){
  return("0")
} else {
  return("1")}
}

2 个答案:

答案 0 :(得分:1)

您可以使用ifelse功能:

r1 <- ifelse(p >= u, 1, 0)

或者您可以简单地将逻辑比较转换为数字向量,将TRUE转换为1,将FALSE转换为0:

r1 <- as.numeric(p >= u)

答案 1 :(得分:1)

@DavidRobinson提供了一个很好的工作解决方案,但让我们来看看为什么你的尝试不起作用:

r1<-for(i in 1:1000){
if(p[i]<u[i]){
  return("0")
} else {
  return("1")}
}

我们遇到了一些问题,其中最大的一个问题就是你通过分配和使用forreturn()循环与一般函数混淆。当您使用return()编写自己的函数时,将使用function() <- ...。在for循环内部,不需要它。 for循环只运行其中的代码一定次数,它不能返回类似函数的东西。

需要一种存储结果的方法。最好通过预先分配结果向量,然后将其填充到for循环内来完成。

r1 <- rep(NA, length(p)) # create a vector as long as p
for (i in 1:1000) {
    if (p[i] < u[i]) {   # compare the ith element of p and u
        r1[i] <- 0       # put the answer in the ith element of r1
    } else {
        r1[i] <- 1
    }
}

我们可以简化一下。您可以将if作为全0开始,而不是使用else r1,而只需p[i] >= u[i]将其更改为1 }。为了安全起见,我认为最好使for语句类似for (i in 1:length(p)),或者最好for (i in seq_along(p)),但R的优点是需要多少循环,而@ DavidRobinson的矢量化建议是远的清洁剂。