我是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)
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)
我无法弄清楚我的错误在哪里 - 我在这里错过了什么?
答案 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