2015-06-23 1 views
-1

Я пытаюсь запустить численное моделирование в диапазоне точек из набора данных, созданного с помощью расширенной сетки. Я хотел бы использовать plyr или dplyr для этого, если это возможно. Однако я не понимаю синтаксис.Как использовать ddply или dplyr для оценки многопараметрической функции с невокализованными входами в кадр данных?

Есть небольшое возмущение по приведенному ниже коду, который применяет значения x и y отдельно от f?

f <- function(x, y) { 
    A <- data_frame(a = x*runif(100) - y) 
    B <- data_frame(b = A$a - rnorm(100)*y) 
    sum(A$a) - sum(B$b) 
} 

X <- expand.grid(x = 1:10, y = 2:8) 
X %>% mutate(z = f(x, y)) 

Я надеялся, что ddply может сделать это проще.

EDIT: Это, кажется, ведут себя как положено:

X %>% ddply(.(x, y), transform, z = f(x, y)) 
+0

Какая ошибка вы получаете? –

+0

Есть ли какие-нибудь группировки? Или вы просто делаете то же самое для каждой строки? – Gregor

+0

Я хочу сделать то же самое для каждой строки: используйте значения в каждой строке для оценки функции. Я думаю. Нет группировки. – wdkrnls

ответ

1

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

+1

' plyr :: mdply (X, f) 'является единственной причиной, по которой я по-прежнему предпочитаю plyr над dplyr – baptiste

+0

Это выглядит хорошо, я никогда не использовал его. Я все еще вытаскиваю plyr для 'ldply',' llply' и т. Д. – Gregor