我正在将两个条件应用于数据帧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
的内部,我将很高兴提出有关如何以其他方式解决此问题的建议。
答案 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
,因为您要检查price
和ms
的条件。
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))))