有没有一种方法可以使用运算符,这些运算符是R中数据框中的一列

时间:2019-10-16 20:31:35

标签: r dataframe operators

实际目标远不止于此,但恰好在其中,我需要执行方程式,其中运算符是数据帧中的值之一。该示例代码按照所使用的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)

3 个答案:

答案 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()将其他列作为参数传递。