【问题标题】:Apply a function to every nth element in vector将函数应用于向量中的每个第 n 个元素
【发布时间】:2017-11-29 10:09:10
【问题描述】:

我在 R 中有一个向量:

> v <- c(5, 10, 15, 20, 25, 30, 35, 40, 45, 50)

我想对向量的每个第 n 个元素应用一个函数并让它返回新向量。例如,假设我想将向量的每三个元素乘以 2。然后我会得到

> v
[1] 5 10 30 20 25 60 35 40 90 50

我已经设法使用矢量逻辑提取元素:

> v[c(rep(FALSE,2),TRUE)]
[1] 15 30 45

意思是我已经弄清楚如何访问这些元素并且我能够对它们做一些事情,但我不知道如何将它们恢复到我的原始向量 v。

【问题讨论】:

标签: r vector


【解决方案1】:

我们需要分配

v[c(FALSE, FALSE, TRUE)] <- v[c(FALSE, FALSE, TRUE)]*2

【讨论】:

    【解决方案2】:

    使用ifelse的解决方案:

    ifelse(1:length(v) %% 3 == 0, v * 2, v)
    # [1]  5 10 30 20 25 60 35 40 90 50
    

    【讨论】:

      【解决方案3】:

      另一种选择是使用seq。您可以随意指定n,而seq 将从n 开始一个序列,由n 开始,直到您的向量结束(length(v))。

      n <- 3
      v[seq(n, length(v), n)] <- v[seq(n, length(v), n)]*2
      
      > v
       [1]  5 10 30 20 25 60 35 40 90 50
      

      【讨论】:

        【解决方案4】:

        使用 tidyverse:

            library(tidyverse)
            p <- seq(v) %% 3 == 0
            f <- function(x) x*2
            map_if(v, p, f) %>% as_vector
        

        【讨论】:

          【解决方案5】:

          使用while循环:

          i=0  
          while (i < (length(v)-1) ){
              i=i+3
              v[i]=v[i]*2
          }
          
          > v
           [1]  5 10 30 20 25 60 35 40 90 50
          

          【讨论】:

          • 在向量上使用循环有点矫枉过正,通过这种逻辑,我们也可以添加 forloop,应用族函数解决方案。
          猜你喜欢
          • 2013-08-28
          • 1970-01-01
          • 2022-11-02
          • 2011-07-11
          • 2013-10-13
          • 1970-01-01
          • 2022-07-20
          • 1970-01-01
          相关资源
          最近更新 更多