【问题标题】:Making a looping statement that populates a vector?制作一个填充向量的循环语句?
【发布时间】:2016-10-02 22:02:01
【问题描述】:

我尝试了几种方法来解决这个问题,但在编写它时遇到了麻烦。我想我前三个步骤是正确的,但现在我必须用来自y 的数字填充向量z,这些数字可以被四整除,不能被三整除,并且具有奇数位数。我知道我以错误的方式使用了print 函数,我只是不知道还能用什么...... 这与其他问题不同,因为我没有使用 while 循环。

#Step 1: Generate 1,000,000 random, uniformly distributed numbers between 0 
#and 1,000,000,000, and name as a vector x. With a seed of 1.
set.seed(1)
x=runif(1000000, min=0, max=1000000000)

#Step 2: Generate a rounded version of x with the name y
y=round(x,digits=0)

#Step 3: Empty vector named z
z=vector("numeric",length=0)

#Step 4: Create for loop that populates z vector with the numbers from y that are divisible by
#4, not divisible by 3, with an odd number of digits. 
for(i in y) {
  if(i%%4==0 && i%%3!=0 && nchar(i,type="chars",allowNA=FALSE,keepNA=NA)%%2!=0){
    print(z,i)
  }
}

【问题讨论】:

  • 要打印连接的字符串,请使用paste 函数。例如,print(paste0(z, i))
  • 对于这种类型的任务,您不需要(也不应该)使用循环(数据的直接子集应该可以工作,例如y[y%%4 == 0 & y%%3 != 0 & nchar(y) %% 2 != 0] - 未经测试!)
  • PS 你不需要指定所有可选参数:nchar(i) 应该可以正常工作
  • 不客气。我觉得奇怪的是,在“R 简介”课程中,您学习了有关 for 循环的内容,但由于子集通常更有效率且 r-way 做事,因此通常不鼓励使用它们

标签: r


【解决方案1】:

注意:根据@BenBolker 的评论,循环是解决您的问题的低效方法。通常,在 R 中,尽量避免循环以最大限度地提高代码的效率。 @SymbolixAU 在 cmets 中提供了一个这样做的示例。话虽如此,为了帮助您了解循环和向量的来龙去脉,这里有一个只需要更改一行代码的解决方案:

您已经在循环之前创建了向量,这是一个好的开始。现在,在您的循环中,您需要填充该向量。为此,您目前拥有print(z,i),它不会做太多事情。你需要改变向量本身:

z <- c( z, i )

应该为您工作(只需替换循环中的 print 行)。

这里发生的情况是,我们正在使用现有的z 向量,将i 绑定到它的末尾,并再次创建新的向量z。因此,每次添加一个值时,向量都会变长一点,这样您就会得到一个完整的向量。

【讨论】:

  • 这行得通,但应该注意的是,R 中的“增长”向量效率非常低;请参阅上面@SymbolixAU 的评论以获得更好的方法
  • @BenBolker,我同意,但我觉得 OP 正在学习循环、向量等。所以我认为如何使代码按原样工作的课程很有帮助。 SymbolixAU 的答案在这里肯定更有效。
  • 是的,我同意。只是可能值得一提,以供将来参考,或供其他人停下来查看答案。
  • @BenBolker:好点。我在答案中添加了注释。希望这两点都能得到理解(学习一项技能,并了解到你刚刚学到的技能并不是做事的最佳方式)...... :)
  • 我不完全确定您的意思,但听起来您可能缺少括号或其他内容。如果您输入了一行不完整的代码,R 将显示一个新行,用于完成您的代码。例如:z&lt;-c(z,2 显示 + 提示符,这是 R 表示“aaaaand theeeeeeennn...”的方式,因为在您关闭括号之前它无法完成该代码。
【解决方案2】:

你有 print 的地方改为:

z <- append(z, i)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多