首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R:如何在不限制循环范围的情况下仅打印循环中的前5个真实条件

R:如何在不限制循环范围的情况下仅打印循环中的前5个真实条件
EN

Stack Overflow用户
提问于 2021-06-22 18:08:50
回答 2查看 50关注 0票数 1

假设我有一个数字列表。

代码语言:javascript
运行
复制
x <- c(10,12,5,23,40,27,11,4,7,25,21,7,99,45,2,10)

我想在for循环中使用if条件打印大于20的前5个数字,因为这是一个简单的可重现示例,而实际场景需要在for循环中使用if条件。有没有一种方法可以在不限制范围的情况下获得大于20的前5个数字?查找所有大于20的数字的方法如下所示

代码语言:javascript
运行
复制
for(i in 1:length(x)){
if(x[i]>20){
print(x[i])
}
}

这个问题也可以看作是将print语句限制在前5个实例中。有人能帮帮忙吗?请注意,不能将for循环的范围限制为达到解决方案。

必填答案为

代码语言:javascript
运行
复制
23,40,27,25,21

必须使用for循环、if条件和print语句/cat/writeLines

EN

回答 2

Stack Overflow用户

发布于 2021-06-22 18:11:09

这会起作用吗:

代码语言:javascript
运行
复制
x[x > 20][1:5]
[1] 23 40 27 25 21

使用for循环:

代码语言:javascript
运行
复制
v <- vector()
for(i in 1:length(x)){
  if(x[i] > 20){
    v <- c(v,x[i])
  }  
  if(length(v) == 5){
    print(v)
    break
  }
}
[1] 23 40 27 25 21
票数 3
EN

Stack Overflow用户

发布于 2021-06-22 18:12:35

事实证明,限制for循环的范围是允许的,这可以使用cumsum(x > 20) <= 5来完成

代码语言:javascript
运行
复制
for(i in seq_len(match(5, cumsum(x > 20), length(x)))) {
  if(x[i] > 20) {
    print(x[i])
  }
}
#[1] 23
#[1] 40
#[1] 27
#[1] 25
#[1] 21

或者添加一个计数器:

Variant将在5次点击后中断(感谢@sindri-baldur):

代码语言:javascript
运行
复制
n <- 0L
for(i in 1:length(x)){
  if(x[i]>20) {
    print(x[i])
    n <- n+1L
    if(n == 5L) break
  }
}

变种,这将使整个循环。

代码语言:javascript
运行
复制
n <- 0L
for(i in 1:length(x)){
  if(x[i]>20 & n<5) {
    n <- n+1L
    print(x[i])
  }
}

要获得前5个,可以使用head

代码语言:javascript
运行
复制
head(x[x > 20], 5)
#[1] 23 40 27 25 21

请注意,这也适用于命中次数少于5次的情况。然后,它将返回命中次数。例如,试着用:

代码语言:javascript
运行
复制
x <- c(10,12,5,23,40,27,11,4,7,25,2,7,9,4,2,10)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68081612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档