实际目标远不止于此,但恰好在其中,我需要执行方程式,其中运算符是数据帧中的值之一。该示例代码按照所使用的df格式复制三列。在此示例df中,我想执行20 + 5、10-10和5 * 15的操作。
# R code for sample df
a <- c(20,10,5)
b <- as.character(c("+","-","*"))
c <- c(5,10,15)
df <- data.frame(a,b,c)
答案 0 :(得分:2)
使用dplyr
的一种相当清晰的方法可能是:
df %>%
mutate(d = case_when(b == "+" ~ a + c,
b == "-" ~ a - c,
TRUE ~ a * c))
在这里,您实质上定义了关系。由于没有那么多运算符,所以也没有问题。
@Gregor已概述的另一种方法涉及eval(parse(...))
:
df %>%
rowwise() %>%
mutate(d = paste(a, b, c),
d = eval(parse(text = d)))
但是,您应该小心使用它。参见What specifically are the dangers of eval(parse(…))?
答案 1 :(得分:1)
sapply(with(df, paste(a, b, c)), function(x) eval(parse(text = x)))
20 + 5 10 - 10 5 * 15
25 0 75
但是要当心!当您沿着这条路走时,事情会变得非常混乱。易碎,难以调试。
答案 2 :(得分:1)
如果仅使用简单的原始二进制操作数,则可以获取函数并将其应用于值。例如
with(df, mapply(function(op,x,y) {op(x, y)},
mget(as.character(b), inherits=TRUE), a, c))
这里,我们使用mget()
获取每个运算符的功能,然后使用mapply()
将其他列作为参数传递。