循环是在同一向量中的元素之间进行操作的最有效方法吗?

时间:2012-05-28 15:38:11

标签: r loops

我知道标题中的措辞很尴尬。但是这里有免费的碎片:

假设我有一个向量x。假设我想得到x[i] - x[i-1]向下运行向量的值列表,即变化率。如果你参考这个例子,我希望将24.30518 - 24.43082等的值保存在一个新的向量中。循环是R中最有效的方法吗?

   hour   value
1    00 24.43082
2    01 24.30518
3    02 24.18798
4    03 24.07979
5    04 23.99070
6    05 23.91297
7    06 23.84412
8    07 23.83976
9    08 24.37504
10   09 25.24583
11   10 26.22111
12   11 27.14665
13   12 27.85554
14   13 28.34957
15   14 28.53274
16   15 28.39928
17   16 28.03880
18   17 27.51899
19   18 26.91361
20   19 26.16487
21   20 25.52663
22   21 25.10923
23   22 24.79797
24   23 24.58154

是否可以使用lapply执行此操作?或者使用滞后等其他方式?还是其他任何简约的方式?

奖金问题: 我处理的数据是一个循环温度序列,这意味着矢量的最后一个元素将跟随矢量的第一个元素。在这种情况下,是否可以扩展上述任何方法以获得一组完整的值(而不是输出的第一个元素的空值)

3 个答案:

答案 0 :(得分:3)

'diff'给出滞后差异,滞后默认为1(根据需要)。

要获取附加元素,请直接计算并预先添加diff:

的结果
first <- x$value[1] - x$value[length(x$value)
result <- c(first, diff(x$value))

答案 1 :(得分:2)

避免R中的循环 - 它们很慢。对于您的特定任务,请使用diff

答案 2 :(得分:1)

您的问题的更一般的答案是在矢量和矢量的移位副本之间进行数学运算。 diff()函数是差异的一种特殊情况,但您可以在两个移位向量上使用任何向量化函数。例如,假设您想要x的产品和x中的下一个项目。

n <- length(x)
x[1:(n-1)] * x[2:n]

(你可能想要填充它以匹配原始向量的长度,在这种情况下可能最后,因为最后一项不能乘以下一项。)

{在一般情况下直接回答你的问题,这是一个差异方程式

x[2:n] - x[1:(n-1)]

}