使用带有条件的lapply循环遍历行

时间:2016-04-18 17:36:01

标签: r

我是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)
  • 我希望将其转换为仅增加数据点的向量。为简单起见,假设我希望所有元素(如第2个元素(小于前一个元素))成为上一个元素和下一个元素的平均值
  • 为此,我尝试使用这样的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)

我无法弄清楚我的错误在哪里 - 我在这里错过了什么?

2 个答案:

答案 0 :(得分:4)

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)

答案 1 :(得分:1)

认为这会有效,假设我正确理解你的问题。

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