【问题标题】:how to set a value at a current level to zero based on the previous values如何根据先前的值将当前级别的值设置为零
【发布时间】:2021-06-20 13:59:03
【问题描述】:

我有数据,我想对这些数据运行一个复杂的函数。该函数的思想是,如果当前元素的值为>特定值,那么所有即将到来的元素的值都需要设置为0。例如,

假设我的数据是x <- 1:16 然后,我想找到从116 的每个值的平方根,如果我们得到一个大于3 的平方根,那么循环必须停止并设置0 的所有即将到来的值。

例如,9 的平方根是3。因此,函数必须在此处停止并将元素的所有值设置为从9160

这是我的尝试:

xy <- list()
for (i in seq_along(x)){
  xy[[i]] <- myfunc(x[i])
  if (xy[[i]] > 3 ) 
    break
  xy[[i]] <- 0
}

所以我希望这些值是这样的:

     > xy
[[1]]
[1] 1

[[2]]
[1] 1.4

[[3]]
[1] 1.7

[[4]]
[1] 2

[[5]]
[1] 2.2

[[6]]
[1] 2.4

[[7]]
[1] 2.6

[[8]]
[1] 2.8

[[9]]
[1] 0

[[10]]
[1] 0
 
[[11]]
[1] 0

[[10]]
[1] 0

[[12]]
[1] 0

[[13]]
[1] 0

 [[14]]
[1] 0

[[15]]
[1] 0

[[16]]
[1] 0

【问题讨论】:

    标签: r


    【解决方案1】:

    为此,您可以使用:

    x <- 1:16
    out <- vector("list", length = length(x))
    for(i in seq_along(x)) {
       if(sqrt(x[i]) < 3) {
         out[[i]] <- sqrt(x[i])
       } else {
         out[i:length(x)] <- 0
       }
    }
    out
    [[1]]
    [1] 1
    
    [[2]]
    [1] 1.414214
    
    [[3]]
    [1] 1.732051
    
    [[4]]
    [1] 2
    
    [[5]]
    [1] 2.236068
    
    [[6]]
    [1] 2.44949
    
    [[7]]
    [1] 2.645751
    
    [[8]]
    [1] 2.828427
    
    [[9]]
    [1] 0
    
    [[10]]
    [1] 0
    
    [[11]]
    [1] 0
    
    [[12]]
    [1] 0
    
    [[13]]
    [1] 0
    
    [[14]]
    [1] 0
    
    [[15]]
    [1] 0
    
    [[16]]
    [1] 0
    

    【讨论】:

    • 我很高兴,很抱歉我不能在另一个方面提供太多帮助。实际上,如果您决定在接下来的几个小时内再次发布,我请我的一个朋友看看您之前的问题,他绝对可以帮助您。
    • 为我的同胞随时随地。贴出来我再问他。
    • 我在想这是一个骗子。还有更多内容。我重新打开了。
    • @akrun 不,没关系,我让她重新发布主要问题。如果你能看一下,我将不胜感激。
    • @AnoushiravanR 我添加了一个修改后的解决方案。可能,这适用于 OP
    【解决方案2】:

    你可以使用向量化操作

    x <- 1:16
    
    val <- sqrt(x)
    ifelse(cumsum(val >3), 0, val)
    # [1] 1.000000 1.414214 1.732051 2.000000 2.236068
    # [6] 2.449490 2.645751 2.828427 3.000000 0.000000
    # [11] 0.000000 0.000000 0.000000 0.000000 0.000000
    # [16] 0.000000
    

    在这里,我们讨论您的 x 值并找到平方根,然后使用 cumsum()(累积和)函数以及您的布尔检查来查看是否有任何值通过检查。基本上 FALSE 值为 0,因此当您获取累积总和时,它保持为零,但是当您获得第一个 TRUE 值时,累积总和将保持大于 1,这将是 TRUE。这里第一个之后的所有值都将被ifelse设置为0

    【讨论】:

    • 非常感谢您的大力帮助。有什么办法可以将其保留为列表。因为我的函数需要一个循环或lapply 函数
    【解决方案3】:

    更多方法

    #one way
    purrr::map(1:16, ~ ifelse(sqrt(.x) > 3, 0, sqrt(.x)))
    #> [[1]]
    #> [1] 1
    #> 
    #> [[2]]
    #> [1] 1.414214
    #> 
    #> [[3]]
    #> [1] 1.732051
    #> 
    #> [[4]]
    #> [1] 2
    #> 
    #> [[5]]
    #> [1] 2.236068
    #> 
    #> [[6]]
    #> [1] 2.44949
    #> 
    #> [[7]]
    #> [1] 2.645751
    #> 
    #> [[8]]
    #> [1] 2.828427
    #> 
    #> [[9]]
    #> [1] 3
    #> 
    #> [[10]]
    #> [1] 0
    #> 
    #> [[11]]
    #> [1] 0
    #> 
    #> [[12]]
    #> [1] 0
    #> 
    #> [[13]]
    #> [1] 0
    #> 
    #> [[14]]
    #> [1] 0
    #> 
    #> [[15]]
    #> [1] 0
    #> 
    #> [[16]]
    #> [1] 0
    
    #2nd way
    Map(\(.x) ifelse(sqrt(.x) > 3, 0, sqrt(.x)), 1:16)
    #> [[1]]
    #> [1] 1
    #> 
    #> [[2]]
    #> [1] 1.414214
    #> 
    #> [[3]]
    #> [1] 1.732051
    #> 
    #> [[4]]
    #> [1] 2
    #> 
    #> [[5]]
    #> [1] 2.236068
    #> 
    #> [[6]]
    #> [1] 2.44949
    #> 
    #> [[7]]
    #> [1] 2.645751
    #> 
    #> [[8]]
    #> [1] 2.828427
    #> 
    #> [[9]]
    #> [1] 3
    #> 
    #> [[10]]
    #> [1] 0
    #> 
    #> [[11]]
    #> [1] 0
    #> 
    #> [[12]]
    #> [1] 0
    #> 
    #> [[13]]
    #> [1] 0
    #> 
    #> [[14]]
    #> [1] 0
    #> 
    #> [[15]]
    #> [1] 0
    #> 
    #> [[16]]
    #> [1] 0
    
    #3rd way
    lapply(1:16, \(.x) ifelse(sqrt(.x) > 3, 0, sqrt(.x)))
    #> [[1]]
    #> [1] 1
    #> 
    #> [[2]]
    #> [1] 1.414214
    #> 
    #> [[3]]
    #> [1] 1.732051
    #> 
    #> [[4]]
    #> [1] 2
    #> 
    #> [[5]]
    #> [1] 2.236068
    #> 
    #> [[6]]
    #> [1] 2.44949
    #> 
    #> [[7]]
    #> [1] 2.645751
    #> 
    #> [[8]]
    #> [1] 2.828427
    #> 
    #> [[9]]
    #> [1] 3
    #> 
    #> [[10]]
    #> [1] 0
    #> 
    #> [[11]]
    #> [1] 0
    #> 
    #> [[12]]
    #> [1] 0
    #> 
    #> [[13]]
    #> [1] 0
    #> 
    #> [[14]]
    #> [1] 0
    #> 
    #> [[15]]
    #> [1] 0
    #> 
    #> [[16]]
    #> [1] 0
    

    reprex package (v2.0.0) 于 2021-06-20 创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-30
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多