Примените функцию, которая возвращает data.frame / tibble в столбце vector / data.frame и связывает результаты - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть функция, которая выбирает некоторые данные из базы данных.Он принимает один параметр и возвращает data.frame.Я хотел бы использовать входной вектор этих параметров и передать их на карту или аналогичную функцию, которая принимает каждый элемент и возвращает результаты в БД.Результаты могут различаться в строках, но столбцы всегда одинаковы.Как мне обходиться без зацикливания и связывания строк?(для меня в ..)

Я попробовал следующий маршрут:

myfuncSingleRow<-function(nbr){ 
data.frame(a=nbr,b=nbr^2,c=nbr^3)}

myfuncMultipleRow<-function(nbr){ 
    data.frame(a=rep(nbr,3),b=rep(nbr^2,3),c=rep(nbr^3,3))}

a<-data.frame(count=c(1,2,3))

myfuncSingleRow(2)
myfuncMultipleRow(2)


a %>% select(count) %>% map_dfr(.f=myfuncSingleRow) #output as expected    
a %>% select(count) %>% map_dfr(.f=myfuncMultipleRow) #output not as expected

Теперь это не работает так, как задумано.Пример myFuncMultipleRow, я ожидал, что первые 3 строки будут равны, следующие 3 равны, и то же самое для финального 3. Пример использования myFuncMultipleRow:

Получение

  a b  c
1 1 1  1
2 2 4  8
3 3 9 27
4 1 1  1
5 2 4  8
6 3 9 27
7 1 1  1
8 2 4  8
9 3 9 27

Wanting:

  a b  c
1 1 1  1
2 1 1  1
3 1 1  1
4 2 4  8
5 2 4  8
6 2 4  8
7 3 9 27
8 3 9 27
9 3 9 27

Как обычно, я, вероятно, неправильно использую функции, но немного застрял здесь и не хочу переходить к старому циклу и rbind, которые, вероятно, были бы узким местом в производительности.Любые желающие?

РЕДАКТИРОВАТЬ: Как указано, «каждый» аргумент в «rep» решает этот, но не решает основной вопрос.Если map итерировал и вызывал функцию для каждого элемента, то использование параметра «each» и «times» для функции «rep» должно давать тот же результат.Функция, переданная в map, не векторизована, но предполагает один параметр длины 1. Решение необходимо сделать:

res<-data.frame()
for(i in a) res<-rbind(res,myfuncMultipleRow(i))

1 Ответ

0 голосов
/ 22 февраля 2019

Итак, после просмотра последней версии purrr 0.3.0 (была в более старой версии) map_depth указала в правильном направлении.

a %>% select(count)%>% map_depth(.depth=2,.f=myfuncMultipleRow) %>%  map_dfr(.f=bind_rows)

Отбрасывание map_depth (), bind_rows () и размещение вместо:

a %>% select(count)%>% map_dfr(~map_dfr(.,myfuncMultipleRow))
a %>% select(count)%>% map_dfr(.f=function(x) map_dfr(x,.f=myfuncMultipleRow))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...