繁体   English   中英

根据一列的多个条件构造循环 R

[英]Construct a loop based on multiple conditions in a column R

我有一个df附加,我想创建一个循环,该循环将根据"x9"列中的条件应用特定序列。 我希望能够自己设置序列,这样我就可以为这个数据框尝试不同的序列,我将在下面解释更多。

我有一个算法的损失和胜利的df 在获胜的第一个实例中,我想获取"x9"中的值并将其除以序列值。 我想继续遍历序列值,直到出现损失。 一旦出现损失,序列将重新开始。

风险控制是我试图创建的列,它从"x9"中获取值并将它们除以序列值。 我希望能够更改序列值。

在此处输入图像描述

简而言之,我需要以下方面的帮助:

  1. 构建一个应用于我的 df 的序列,希望能够改变它以尝试不同的序列;
  2. 在“x9”中取值并创建一个新列来应用序列值集。 该序列取“x9”中的值并将其除以序列号;
  3. 构造一个循环以遍历整个 df 以将其应用于所有值。

我将不胜感激任何人可以提供的任何帮助/见解。

structure(list(x1 = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), x2 = c("2016.01.04 01:05", 
"2016.01.04 01:12", "2016.01.04 01:13", "2016.01.04 01:17", "2016.01.04 01:20", 
"2016.01.04 01:23", "2016.01.04 01:25", "2016.01.04 01:30", "2016.01.04 01:31", 
"2016.01.04 01:59"), x3 = c("buy", "close", "buy", "close", "buy", 
"close", "buy", "t/p", "buy", "close"), x4 = c(1, 1, 2, 2, 3, 
3, 4, 4, 5, 5), x5 = c(8.46, 8.46, 8.6, 8.6, 8.69, 8.69, 8.83, 
8.83, 9, 9), x6 = c(1.58873, 1.58955, 1.5887, 1.58924, 1.58862, 
1.58946, 1.58802, 1.58902, 1.58822, 1.58899), x7 = c(1.57873, 
1.57873, 1.5787, 1.5787, 1.57862, 1.57862, 1.57802, 1.57802, 
1.57822, 1.57822), x8 = c(1.58973, 1.58973, 1.5897, 1.5897, 1.58962, 
1.58962, 1.58902, 1.58902, 1.58922, 1.58922), x9 = c("$0.00", 
"$478.69", "$0.00", "$320.45", "$0.00", "$503.70", "$0.00", "$609.30", 
"$0.00", "$478.19"), x10 = c("$30,000.00", "$30,478.69", "$30,478.69", 
"$30,799.14", "$30,799.14", "$31,302.84", "$31,302.84", "$31,912.14", 
"$31,912.14", "$32,390.33"), `Risk Control` = c(NA, "$478.69", 
NA, "$320.45", NA, "$251.85", NA, "$304.65", NA, "$159.40"), 
    Sequence = c(NA, 1, NA, 1, NA, 2, NA, 2, NA, 3)), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"), spec = structure(list(
    cols = list(x1 = structure(list(), class = c("collector_double", 
    "collector")), x2 = structure(list(), class = c("collector_character", 
    "collector")), x3 = structure(list(), class = c("collector_character", 
    "collector")), x4 = structure(list(), class = c("collector_double", 
    "collector")), x5 = structure(list(), class = c("collector_double", 
    "collector")), x6 = structure(list(), class = c("collector_double", 
    "collector")), x7 = structure(list(), class = c("collector_double", 
    "collector")), x8 = structure(list(), class = c("collector_double", 
    "collector")), x9 = structure(list(), class = c("collector_character", 
    "collector")), x10 = structure(list(), class = c("collector_character", 
    "collector")), `Risk Control` = structure(list(), class = c("collector_character", 
    "collector")), ...12 = structure(list(), class = c("collector_logical", 
    "collector")), Sequence = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), delim = ","), class = "col_spec"))

也许有更好的方法,但我相信以下 function 可以满足问题的要求。 它需要两个 arguments,一个要处理的向量x和一个序列Seq 返回值就是题中描述的风控。

constructRisk <- function(x, Seq){
  stopifnot(length(x) > 0)
  stopifnot(length(Seq) > 0)
  n <- length(x)
  m <- length(Seq)
  y <- numeric(n)
  iSeq <- 1L
  for(i in seq_len(n)){
    y[i] <- x[i]/Seq[iSeq]
    if(!is.na(y[i])){
      if(y[i] < 0) iSeq <- 0L
    }
    iSeq <- iSeq + 1L
    if(iSeq > m) iSeq <- 1L
  }
  y
}

请注意,由于发布的数据包含带有美元符号的列x9 ,因此属于 class "character" ,下面的测试是针对它的数字版本X9 风险控制栏也是如此,如发布的那样。

X9 <- as.numeric(sub("\\$", "", df1$x9))
RskCntr <- as.numeric(sub("\\$", "", df1$`Risk Control`))

RC <- constructRisk(X9, df1$Sequence)

all.equal(RskCntr, RC)
#[1] "Mean relative difference: 2.091175e-05"
all.equal(RskCntr, round(RC, 2))
#[1] TRUE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM