使用滞后功能

时间:2015-03-01 18:53:52

标签: r xts

我试着重新提出我的问题。

我有两个数据数组(在工作表示例列E和F中)。 我想用这些规则来创建一个新阵列:

如果E< -0.03然后0如果F> 0.03然后其他1继承新阵列的先前值。

在我的示例工作表中,这一切都在一列(H列)中完成。 我想在R中创建相同的数组(列H)。我的问题是在R中你无法在完全创建数组之前调用它。

我无法想办法绕过这个问题。 我问你用哪种技术在R中创建H列中的数组

https://dl.dropboxusercontent.com/u/102669/example.xlsx

1 个答案:

答案 0 :(得分:1)

好的,你的上一次评论会引起一些困惑:

  

我们有两个信号矢量,旧信号矢量(11,11,11,11,11)和我们正在创建的新信号矢量:signal = ifelse ...等。

在R中,您无法在创建新变量时引用它,您必须先完成创建。

那说你仍然没有用文字解释你想做什么所以非常难以试图纠正你的代码。我完全理解你的代码是做什么的,为什么---但是非常难以知道你真正想要的东西,因为你还没有解释你的逻辑。 (这可能解释了你问题的失误。)所以这是我最好的猜测。

## The set-up
signal = c(11, 11, 11, 11, 11) 
sig1 = c(1, 2, 3, 4, 5) 
sig2 = c(6, 7, 8, 9, 10)

## Let's get a temp variable, the thing we want to lag
## (again, this is a guess)
(sig.temp = ifelse(sig1 < 3, 0, signal))
# [1]  0  0 11 11 11

(new.signal = ifelse(sig1 < 3, 0, ifelse(sig2 > 8, 0.2, lag(sig.temp))))
[1] 0.0 0.0 0.0 0.2 0.2

编辑:

# Another way, this time doing both comparisons before the lag
sig.temp2 = ifelse(sig1 < 3, 0, ifelse(sig2 > 8, 0.2, signal))
new.signal = ifelse(sig1 < 3 | sig2 > 8, sig.temp2, lag(sig.temp2))
# [1] 0.0 0.0 0.0 0.2 0.2

R和Excel之间的区别在于Excel将一次一个地执行操作,并根据更改自动更新。 R永远不会自动更新。例如,在R

x = 1
y = x + 1
# y is 2
x = 5
y 
# [1] 2
# y is still 2

但是,在Excel中,如果设置B1 = A1 + 1,则将保持该关系。因为R没有自动更新,并且R不喜欢一次做一件事(它一次创建一个矢量,而不是一次创建一个矢量),你需要一个temp变量

更多编辑

好的,仔细查看电子表格,D列根本就没用过。就像原始问题中的c(11, 11, 11, ...)根本没有被使用一样。唯一重要的列是sig1和`sig2,即E和F列。以下是Excel中的相关数据,第14-36行:

col_e = c(14.286, 13.333, 12.5, 11.765, 8.333, 5.263, 7.692, 7.5, -4.762, 
          -2.326, -7.5, -4.762, 2.703, -7.5, 2.632, 7.027, 0, -1.768, -1.026, 
          -4.37, -3.109, 2.043, -0.588) / 100

col_f = c(6.67, 6.25, 5.88, 5.56, 2.63, 2.56, 5, 2.38, -6.98, 5, -11.9, 
          8.11, -5, -2.63, 5.41, 1.54, -1.52, -0.26, -0.77, -3.63, 0.54, 
          1.5, -2.05) / 100

与您期望的结果一起:

desired_result = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 
                   1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L)

现在让我们编写你的逻辑代码。对于例外情况,我们会填写缺失值:

col_g = ifelse(col_e < -.03, 0, ifelse(col_f > 0.04, 1, NA))

然后,我们想要使用之前的非缺失值填充缺失值(NA s)。这与zoo::na.locf()(代表最后观察结果)很好地完成了:

library(zoo)
col_g = na.locf(col_g)

它与Excel匹配吗?

all(na.locf(col_g) == desired_result)
# [1] TRUE

如果您想在一行中执行此操作,可以嵌套语句:

col_g = na.locf(ifelse(col_e < -.03, 0, ifelse(col_f > 0.04, 1, NA)))

现在你已经提供了完整的代码......

我打电话给你的输出栏&#34;期望&#34;在Excel中,并将您的数据读入R.工作正常,所有3367行:

dat = read.table("clipboard", header = T)

result = zoo::na.locf(ifelse(dat$lambda < -8, 0, ifelse(dat$omega > 6, 1, NA)))
all(result == dat$desired)
# [1] TRUE