【问题标题】:Looping through rows using lapply with a conditional使用带条件的 lapply 循环遍历行
【发布时间】:2016-04-18 17:36:01
【问题描述】:

我是 R 的新手,对更多的程序语言有一定的了解。目前,我正试图摆脱不必要的“for”循环,并让它们使用来自 apply 系列的东西。所以这是我的问题:

  • 假设我有一个向量:data <- c(0.0008, 0.0007, 0.0040, 0.0081, 0.0217, 0.0292, 0.0332, 0.0451, 0.0533, 0.0621)
  • 而且我想将它转换成一个只增加数据点的向量。为了简单起见,假设我希望像第二个元素(小于前一个元素)这样的所有元素成为前一个元素和下一个元素的平均值
  • 为此,我尝试像这样使用 lapply:data <- lapply(data, function(i) ifelse(data[i+1]<data[i], data[i+1]<-(data[i]+data[i+2])/2, data[i+1]))
  • 结果是一个包含所有元素的列表(不是向量):logical(0)

我不知道我的错误在哪里 - 我在这里错过了什么?

【问题讨论】:

    标签: r


    【解决方案1】:

    lapply 用于迭代列表中的多个对象并返回一个列表。阅读?lapply。只需一个向量,您就不需要/想要它。

    这是一种非循环的方法:

    w = which( c(FALSE, tail(data, -1) < head(data, -1) ) )
    data[w] = (data[w-1] + data[w+1])/2
    

    如果你有连续递减的元素,你的程序会给出奇怪的结果。以data = c(2, 1, 0, 3) 为例,请注意结果仍然不是单调的。因此,我认为您可能不应该尝试以这种方式进行矢量化,而应该使用循环。此外,您需要考虑当最终元素出现下降时该怎么办,例如c(2,3,0)

    【讨论】:

      【解决方案2】:

      认为如果我正确理解您的问题,这将起作用。

      data <- c(0.0007, 0.0006, 0.0030, 0.0072, 0.0129, 0.0195, 0.0268, 0.0346, 0.0426, 0.0507)
      
      d1 <- head(data, -1) # get the first 9 elements
      d2 <- tail(data, -1) # get the last 9 elements 
      
      means <- rowMeans(cbind(d1, d2)) # get the mean of all data[i] & data[i+1] pairs
      ifelse(d2 < d1, means, d2)
      # [1] 0.00065 0.00300 0.00720 0.01290 0.01950 0.02680 0.03460
      # [8] 0.04260 0.05070
      
      # realized we might need to append back the first element of our original data. If so:
      data <- c(data[1], ifelse(d2 < d1, means, d2))
      data
      # [1] 0.00070 0.00065 0.00300 0.00720 0.01290 0.01950 0.02680 
      # [8] 0.03460 0.04260 0.05070
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多