滞后函数的使用
Use of lag function
我试着重新表述我的问题。
我有两个数据数组(在工作表示例列 E 和 F 中)。
我想用这些规则创建一个新数组:
If E < -0.03 then 0 else if F > 0.03 then 1 else 沿用新数组的前一个值。
在我的示例工作表中,这一切都在一栏(H 栏)中完成。
我想在 R 中创建相同的数组(H 列)。我的问题是,在 R 中,你不能在数组完全创建之前调用它。
我想不出解决这个问题的方法。
我问你将使用哪种技术在 R 中创建 H 列中的数组
好的,你最后的评论有些混乱:
We have two signal vector, the old one (11,11,11,11,11) and the new one we are creating: signal = ifelse...etc.
在 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 不喜欢一次做一件事情(它一次创建一个向量,而不是一次创建一行),所以您需要一个临时变量。
更多编辑
好的,仔细查看您的电子表格,根本没有使用 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)))
现在您已经提供了完整的代码...
我在 Excel 中调用了你的输出列 "desired",并将你的数据读入 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
我试着重新表述我的问题。
我有两个数据数组(在工作表示例列 E 和 F 中)。 我想用这些规则创建一个新数组:
If E < -0.03 then 0 else if F > 0.03 then 1 else 沿用新数组的前一个值。
在我的示例工作表中,这一切都在一栏(H 栏)中完成。 我想在 R 中创建相同的数组(H 列)。我的问题是,在 R 中,你不能在数组完全创建之前调用它。
我想不出解决这个问题的方法。 我问你将使用哪种技术在 R 中创建 H 列中的数组
好的,你最后的评论有些混乱:
We have two signal vector, the old one (11,11,11,11,11) and the new one we are creating: signal = ifelse...etc.
在 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 不喜欢一次做一件事情(它一次创建一个向量,而不是一次创建一行),所以您需要一个临时变量。
更多编辑
好的,仔细查看您的电子表格,根本没有使用 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)))
现在您已经提供了完整的代码...
我在 Excel 中调用了你的输出列 "desired",并将你的数据读入 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