dplyr определяет временную переменную в функции mutate

Я работаю с пакетом dplyr R. Допустим, у меня есть фрейм данных имен и идентификаторов

   df <- data.frame(dID=c(1  ,2  , 1 ),
                   name=c("a","a","b"))

и я хочу разрешить каждый идентификатор из другой базы данных и получить необходимую мне информацию.

   db <- data.frame(dID=c(1   ,2   ,3   ,4   ),
                  info1=c("A" ,"B" ,"C" ,"D" ),
                  info2=c("AA","BB","CC","DD"))

В настоящее время я использую следующий код.

   df %>% rowwise() %>%
   mutate(INFO1 = (function(id){paste(db %>% filter(dID == id) %>% select(info1))})(dID),
          INFO2 = (function(id){paste(db %>% filter(dID == id) %>% select(info2))})(dID))

Мне было интересно, можно ли найти решение, чтобы избежать повторения этой части кода

db %>% filter(dID == id)

сохраняя его во временной переменной. Например, когда я, изменить свой код на

df %>% rowwise() %>%
   mutate(tmp <- db %>% filter(dID == dID),
         INFO1 = paste(tmp %>% select(info1)),
         INFO2 = paste(tmp %>% select(info2))
)

Я получаю эту ошибку

Ошибка в mutate_impl (.data, точки): столбец tmp <- db %>% filter(dID == dID) имеет неподдерживаемый класс data.frame

Есть ли способ сделать код аккуратнее и быстрее?

1 ответ

Решение

Я согласен с комментарием Мариуса. Чтобы продемонстрировать, следующее воспроизводит результат из вашего rowwisedplyr цепь

left_join(df, db) %>% mutate_at(vars(starts_with("info")), ~as.numeric(as.factor(.x)))
#  dID name info1 info2
#1   1    a     1     1
#2   2    a     2     2
#3   1    b     1     1
Другие вопросы по тегам