我有数据框的列
date open high low close adjclose volume
我想再添加一个名为“result”的列(如果close> open则为1,如果close <open则为0)
我做
# Map 1-based optional input ports to variables
data <- maml.mapInputPort(1) # class: data.frame
# calculate pass/fail
data$result <- as.factor(sapply(data$close,function(res)
if (res - data$open >= 0) '1' else '0'))
# Select data.frame to be sent to the output Dataset port
maml.mapOutputPort("data");
但我的结果只有1个。问题出在哪儿?
if/else
只返回一个TRUE / FALSE,并且长度> 1时不进行矢量化。可能适合使用ifelse
(但这也不是必需的,并且与逻辑矢量到二进制的直接coersion(as.integer
)相比效率较低在OP的代码中,'close'列元素循环(sapply
)并从整个'open'列中减去。目的可能是进行元素减法。在这种情况下,列之间的-
更清晰,更有效(因为这些操作是矢量化的)
data$result <- with(data, factor(as.integer((close - open) >= 0)))
在上面,我们得到列之间的差异('close','open'),检查它是否大于或等于0(返回逻辑向量),将其转换为二进制(as.integer
- TRUE - > 1,FALSE - > 0)然后将其更改为factor
类型(如果需要)