Давайте переписать функцию, чтобы сделать то же самое без data_frame
вызовов, только с помощью векторов будет быстрее:
f <- function(x, y) {
a = x * runif(100) - y
b = a - rnorm(100) * y
sum(a) - sum(b)
}
С вами хотите применить это к каждой строке, вы можете сделать это с помощью plyr
или dplyr
. Эти инструменты созданы для «split-apply-comb», где вы разбиваете кадр данных на куски какой-то группой, делаете что-то для каждой части и складываете ее вместе. Вы хотите что-то к каждой отдельной строке, поэтому мы устанавливаем как x
и y
в качестве группировки переменных, которая работает, так как комбинация х и у однозначно определяет строку:
# plyr
ddply(X, .(x, y), plyr::mutate, z = f(x, y))
# dplyr
group_by(X, x, y) %>% dplyr::mutate(z = f(x, y))
Для обоих plyr
и dplyr
, функция mutate
используется, потому что вы хотите добавить столбец в существующий фрейм данных, сохраняя такое же количество строк. Другой общей функцией для использования является summarize
, которая используется, когда вы хотите сконденсировать группы, которые имеют несколько строк в одну итоговую строку. mutate
очень похож на base::transform
.
Существует нецелесообразно использовать plyr
для манипуляции с фреймами данных, dplyr
работает быстрее, и большинство людей считают это более понятным. Он действительно сияет, когда у вас более сложные манипуляции и используются группы, а не отдельные строки. Для отдельных строк, базовая функция mapply
хорошо работает:
X$z = mapply(f, X$x, X$y)
(благодаря @jeremycg в комментариях). Вы можете использовать dplyr
, но в этом случае нет причин для этого.
Какая ошибка вы получаете? –
Есть ли какие-нибудь группировки? Или вы просто делаете то же самое для каждой строки? – Gregor
Я хочу сделать то же самое для каждой строки: используйте значения в каждой строке для оценки функции. Я думаю. Нет группировки. – wdkrnls