Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中有条件地使用滞后值_R_Loops - Fatal编程技术网

在R中有条件地使用滞后值

在R中有条件地使用滞后值,r,loops,R,Loops,我要做的是在带有split_系数的行中获取split_系数值=1用于计算数据框中先前日期的调整后的_close。我正在尝试在R中创建一个循环,该循环将调整的_close值乘以拆分系数,但不包括包含拆分系数的行!=1并重复该过程,直到数据集结束。我能够识别具有拆分系数的行!=1使用(y[,6]!=1,但无法确定如何编写循环以完成此任务。如需有关如何创建此循环的任何帮助,将不胜感激。提前感谢 timestamp open high low close adjusted_close

我要做的是在带有split_系数的行中获取split_系数值=1用于计算数据框中先前日期的调整后的_close。我正在尝试在R中创建一个循环,该循环将调整的_close值乘以拆分系数,但不包括包含拆分系数的行!=1并重复该过程,直到数据集结束。我能够识别具有拆分系数的行!=1使用
(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.你当然可以缩短代码,但我认为这可能会模糊逻辑。另外,我要提到的是,我在这里所做的只是举一个简单的例子,这样做会帮助你更好地向试图帮助的人解释这个问题。感谢所有回复我的同事的人