Есть ли способ использовать операторы, которые являются элементами в столбце в кадре данных в R - PullRequest
1 голос
/ 16 октября 2019

Фактическая цель намного шире, чем эта, но прямо посреди всего этого мне нужно выполнить уравнения, где оператор является одним из значений в фрейме данных. Пример кода реплицирует три столбца в тех форматах, в которых они находятся, из используемого 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 ]

2 голосов
/ 16 октября 2019

Достаточно ясным способом использования 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)))

Однако вы должны использовать его осторожно. См. Каковы конкретно опасности eval (parse (…))?

1 голос
/ 16 октября 2019

Если вы просто используете простые примитивные бинарные операнды, вы можете получить функции и применить их к значениям. Например,

with(df, mapply(function(op,x,y) {op(x, y)}, 
  mget(as.character(b), inherits=TRUE), a, c))

Здесь мы используем mget(), чтобы получить функции для каждого из операторов, а затем используем mapply(), чтобы передать другие столбцы в качестве параметров.

1 голос
/ 16 октября 2019
sapply(with(df, paste(a, b, c)), function(x) eval(parse(text = x)))
 20 + 5 10 - 10  5 * 15 
     25       0      75 

Но будьте осторожны! Когда вы идете по этому пути, все может стать очень грязным. Хрупкий и трудный для отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...