在R中有条件地使用滞后值
我要做的是在带有split_系数的行中获取split_系数值=1用于计算数据框中先前日期的调整后的_close。我正在尝试在R中创建一个循环,该循环将调整的_close值乘以拆分系数,但不包括包含拆分系数的行!=1并重复该过程,直到数据集结束。我能够识别具有拆分系数的行!=1使用在R中有条件地使用滞后值,r,loops,R,Loops,我要做的是在带有split_系数的行中获取split_系数值=1用于计算数据框中先前日期的调整后的_close。我正在尝试在R中创建一个循环,该循环将调整的_close值乘以拆分系数,但不包括包含拆分系数的行!=1并重复该过程,直到数据集结束。我能够识别具有拆分系数的行!=1使用(y[,6]!=1,但无法确定如何编写循环以完成此任务。如需有关如何创建此循环的任何帮助,将不胜感激。提前感谢 timestamp open high low close adjusted_close
(y[,6]!=1
,但无法确定如何编写循环以完成此任务。如需有关如何创建此循环的任何帮助,将不胜感激。提前感谢
timestamp open high low close adjusted_close split_coefficient
7/20/2018 31.61 31.72 30.95 31.04 31.04 1
7/19/2018 31.17 31.57 30.69 31.19 31.19 1
7/18/2018 30.53 31.33 30.26 30.63 30.63 1
7/17/2018 31.67 31.825 30.49 30.89 30.89 1
7/16/2018 31.24 31.79 31 31.23 31.23 1
7/13/2018 32.06 32.37 31.36 31.45 31.45 1
7/12/2018 32.29 32.68 31.69 31.69 31.69 1
7/11/2018 33.37 33.47 32.43 32.93 32.93 1
7/10/2018 32.19 32.8185 31.75 31.84 31.84 1
7/9/2018 33.32 33.37 32.249 32.48 32.48 0.25
7/6/2018 36.03 36.17 34.15 34.23 34.23 1
7/5/2018 36.47 37.46 36.05 36.09 36.09 1
7/3/2018 36.28 37.8299 36 37.33 37.33 1
7/2/2018 38.74 39.22 37.03 37.08 37.08 1
6/29/2018 36.71 37.06 35.78 37 37 1
6/28/2018 38.88 40.51 37.46 38.03 38.03 0.35
6/27/2018 36.14 39.43 35.21 38.56 38.56 1
6/26/2018 36.54 37.89 35.715 36.48 36.48 1
6/25/2018 34.24 39.745 34.24 38.11 38.11 1
6/22/2018 33.04 33.57 32.72 33.06 33.06 1
6/21/2018 32.26 34.84 32.21 34.15 34.15 1
6/20/2018 32.13 32.21 31.655 32.02 32.02 0.5
6/19/2018 33.33 33.92 32.43 32.79 32.79 1
6/18/2018 32.55 33.02 31.19 31.24 31.24 1
6/15/2018 31.94 32.52 31.52 31.67 31.67 1
6/14/2018 31.5 31.83 30.91 31.33 31.33 1
6/13/2018 31.58 32.45 31.44 32.39 32.39 1
6/12/2018 31.86 32.41 31.66 31.97 31.97 1
6/11/2018 32.67 32.77 31.91 32.09 32.09 1
6/8/2018 33.46 33.56 32.41 32.6 32.6 1
我将试图澄清我的问题:
18年6月20日,分割系数是.50。我要做的是将分割系数.5乘以从18年6月8日到18年6月19日的调整后的分割系数。然后,分割系数在18年6月28日变为.35,我想将调整后的分割系数从18年6月21日到18年6月27日乘以.35。由于分割系数定期变化,我认为p或一系列循环可以实现这一点
根据我上面写的内容,我正在寻找一个名为New.adj.Close的新列的以下输出,该列将包含将拆分系数从18年6月20日乘以18年6月8日-18年6月19日调整后的拆分系数时计算出的值:
timestamp open high low close adjusted_close dividend_amount split_coefficient New.Adj.close
6/19/2018 33.33 33.92 32.43 32.79 32.79 0 1 16.395
6/18/2018 32.55 33.02 31.19 31.24 31.24 0 1 15.62
6/15/2018 31.94 32.52 31.52 31.67 31.67 0 1 15.835
6/14/2018 31.5 31.83 30.91 31.33 31.33 0 1 15.665
6/13/2018 31.58 32.45 31.44 32.39 32.39 0 1 16.195
6/12/2018 31.86 32.41 31.66 31.97 31.97 0 1 15.985
6/11/2018 32.67 32.77 31.91 32.09 32.09 0 1 16.045
6/8/2018 33.46 33.56 32.41 32.6 32.6 0 1 16.3
为了澄清,对于
split_系数
等于1的观测值,您是否只想将adjusted_close
乘以split_系数
library(dplyr)
y %>% filter(split_coefficient == 1) %>% mutate(new_col = split_coefficient *adjusted_close)
如果我误解了这个问题,请道歉。为了澄清,对于
split\u系数
等于1的观测值,您是否只想将adjusted\u close
乘以split\u系数
library(dplyr)
y %>% filter(split_coefficient == 1) %>% mutate(new_col = split_coefficient *adjusted_close)
如果我误解了这个问题,请道歉。如评论中强调的,通常避免在
R
中使用循环,并提供更好的替代方法。例如,您可以使用ifelse
:
df <-
data.frame(
adjusted_close = sample(1:5, 10, TRUE),
split_coefficient = sample(1:2, 10, TRUE)
)
# adjusted_close split_coefficient
# 1 5 1
# 2 2 2
# 3 3 2
# 4 2 2
# 5 4 2
# 6 5 2
# 7 1 1
# 8 2 1
# 9 2 2
# 10 2 1
df$m <- ifelse(df$split_coefficient == 1,
df$adjusted_close,
df$adjusted_close * df$split_coefficient
)
# df
# adjusted_close split_coefficient m
# 1 5 1 5
# 2 2 2 4
# 3 3 2 6
# 4 2 2 4
# 5 4 2 8
# 6 5 2 10
# 7 1 1 1
# 8 2 1 2
# 9 2 2 4
# 10 2 1 2
df如注释中所强调的,通常避免在R
中使用循环,并提供更好的替代方法。例如,您可以使用ifelse
:
df <-
data.frame(
adjusted_close = sample(1:5, 10, TRUE),
split_coefficient = sample(1:2, 10, TRUE)
)
# adjusted_close split_coefficient
# 1 5 1
# 2 2 2
# 3 3 2
# 4 2 2
# 5 4 2
# 6 5 2
# 7 1 1
# 8 2 1
# 9 2 2
# 10 2 1
df$m <- ifelse(df$split_coefficient == 1,
df$adjusted_close,
df$adjusted_close * df$split_coefficient
)
# df
# adjusted_close split_coefficient m
# 1 5 1 5
# 2 2 2 4
# 3 3 2 6
# 4 2 2 4
# 5 4 2 8
# 6 5 2 10
# 7 1 1 1
# 8 2 1 2
# 9 2 2 4
# 10 2 1 2
df好的,这使用了tidyverse,但是你可以用base r或其他什么重新编码它。重要的是逻辑。
如前所述,对于这样的任务,您通常不希望使用循环,在这种情况下,您必须执行do while循环,而是利用矢量化
measure_date <- seq(as.Date("2000/1/1"), by = "day", length.out = 20)
pattern <- c(.5, 1,1,1,1)
split_coefficient <- c(pattern, pattern, pattern, pattern)
value_to_multiply <- c(1:20)
df <- data.frame(measure_date, value_to_multiply, split_coefficient)
# doing this because OP's data is reversed
df <- dplyr::arrange(df, measure_date)
# Change the 1s to NAs.
df$newsplit <- ifelse(df$split_coefficient == 1, NA, df$split_coefficient)
df <- tidyr::fill(df , newsplit)
df$multiplied <- df$value_to_multiply*df$newsplit
df
好的,这使用了tidyverse,但是你可以用BaseR或其他什么重新编码它。重要的是逻辑。
如前所述,对于这样的任务,您通常不希望使用循环,在这种情况下,您必须执行do while循环,而是利用矢量化
measure_date <- seq(as.Date("2000/1/1"), by = "day", length.out = 20)
pattern <- c(.5, 1,1,1,1)
split_coefficient <- c(pattern, pattern, pattern, pattern)
value_to_multiply <- c(1:20)
df <- data.frame(measure_date, value_to_multiply, split_coefficient)
# doing this because OP's data is reversed
df <- dplyr::arrange(df, measure_date)
# Change the 1s to NAs.
df$newsplit <- ifelse(df$split_coefficient == 1, NA, df$split_coefficient)
df <- tidyr::fill(df , newsplit)
df$multiplied <- df$value_to_multiply*df$newsplit
df
这些循环应该做什么?问题还不清楚。在任何情况下,R中90%的时间正确的问题不是如何编写循环,而是如何避免循环。请给出一个最小的示例,只需要足够的列和行来显示您的意思,并显示预期的结果。这可能是一个ifelse()情境…@Elin我试图澄清我想要实现的目标,并添加了示例输出以显示所需的输出。因此,如果我理解正确,您实际上希望从数据帧中删除带有!=1分割系数的行,对吗?@Elin我实际想做的是取分割系数va在数据框中,在计算中使用拆分系数!=1的行中的lue,并对之前的日期进行调整。这些循环应该做什么?问题不清楚。在任何情况下,R中90%的时间正确的问题不是如何编写循环,而是如何避免循环。请举一个最小的例子,足够了列和行来显示您的意思,并显示预期的结果情境…@Elin我试图澄清我想要实现的目标,并添加了示例输出以显示所需的输出。因此,如果我理解正确,您实际上希望从数据帧中删除带有!=1分割系数的行,对吗?@Elin我实际想做的是取分割系数va行中的lue,拆分系数!=1,用于计算数据框中先前日期的调整后的_关闭。如果你乘以1,重点是什么?这就是为什么这个问题令人困惑的原因。另外,其他值应该是NA吗?如果你乘以1,重点是什么?这就是问题的原因stion是令人困惑的。其他值应该是NA吗?这难道不是OP想要的相反,即你应该在条件中有!=
而不是=
。检查条件求值。当它是=
到1时,它求值为真并且如果其他返回df$ad调整_close
,否则,它的计算结果为FALSE
,并返回df$adjusted _close*df$split _系数
正确,但原因不明,OP说他只想在值为1时相乘。这不是OP想要的相反吗,即在条件中你应该有!=
而不是=
。检查条件选项求值。当它是==
到1时,它求值为TRUE
,ifelse
返回df$adjusted\u close
,否则,它求值为FALSE
并返回df$adjusted\u close*df$split\u coefficient
正确,但由于不清楚的原因,OP说他只想在值为0时相乘1.你当然可以缩短代码,但我认为这可能会模糊逻辑。另外,我要提到的是,我在这里所做的只是举一个简单的例子,这样做会帮助你更好地向试图帮助的人解释这个问题。感谢所有回复我的同事的人