在“ apply”中使用“ with”时,“ character”类型的“ invalid'envir'自变量”

时间:2019-07-07 13:14:05

标签: r apply

我正在将两个条件应用于数据帧trades1中的每一行(基本上将每一行与一列中的每一行进行比较)。如果同时满足两个条件,则conditions向量应包含1,否则应包含0。

数据示例:

  order     date         time           ms price dir amount    hour index i
1 FUT-3 14.02.06 10:00:00.567 1.950535e+16 66.97 BUY      1 5418154     1 1
2 FUT-3 14.02.06 10:00:00.574 1.950535e+16 66.97 BUY      1 5418154     2 2
3 FUT-3 14.02.06 10:00:00.577 1.950535e+16 66.97 BUY      1 5418154     3 3
4 FUT-3 14.02.06 10:00:00.585 1.950535e+16 66.97 BUY      1 5418154     4 4
5 FUT-3 14.02.06 10:00:00.587 1.950535e+16 66.97 BUY      1 5418154     5 5
6 FUT-3 14.02.06 10:00:00.594 1.950535e+16 66.97 BUY      1 5418154     6 6

代码:

conditions <- apply(trades1, 1, function(x) with(x, as.integer(ms - trades$ms == 1e+6 & price/trades1$price >= 1)))

我检查了trades1是一个数据框,并且列是数字。我收到的错误:

Error in eval(substitute(expr), data, enclos = parent.frame()) : 
  invalid 'envir' argument of type 'character'

如果问题不在于数据参数,而在于将with放在apply的内部,我将很高兴提出有关如何以其他方式解决此问题的建议。

2 个答案:

答案 0 :(得分:5)

with要做的第一件事是将其参数转换为矩阵。完成后,for将不再起作用。

如果您要遍历行(确定是最佳解决方案吗?),请使用普通的lapply循环,或在lst <- lapply(seq_len(nrow(trades1)), function(row) { with(trades1[row, ], ...) } ) do.call(rbind, lst) 的向量上使用行号:

from selenium.webdriver.common.action_chains import ActionChains
percent = random.randint(150, 340)

slider = browser.find_element_by_css_selector("#totalRangeWrap > div:nth-child(2) > div:nth-child(4) > a:nth-child(2)")

move = ActionChains(browser)
move.click_and_hold(slider).move_by_offset(percent, 0).release().perform()

答案 1 :(得分:2)

如@Hong Ooi apply所述,将数据帧转换为矩阵,因此所有数字都转换为字符。您可以通过执行以下操作来纠正apply循环

apply(df, 1, function(x) as.integer(any(as.numeric(x["ms"]) - df$ms == 1e+6 & 
                                    as.numeric(x["price"])/df$price >= 1)))

但是,我认为这里最好的方法是使用mapply,因为您要检查pricems的条件。

as.integer(mapply(function(x, y) 
          any(x - df$ms == 1e+6 & y/df$price >= 1),df$ms, df$price))

使用data.table

的类似方法
library(data.table)
setDT(df)[, ans := as.integer(any(ms - df$ms == 1e+6 & 
                                  price/df$price >= 1)), by = seq_len(nrow(df))]

tidyverse

library(dplyr)
library(purrr)

df %>%
   mutate(ans = map2(ms, price, 
               ~as.integer(any(.x - df$ms == 1e+6 & .y/df$price >= 1))))