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 ответ
Решение
Я согласен с комментарием Мариуса. Чтобы продемонстрировать, следующее воспроизводит результат из вашего rowwise
dplyr
цепь
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