dplyr在mutate函数中定义一个临时变量

时间:2018-08-23 03:30:18

标签: r dplyr mutate

我正在使用R的dplyr软件包。 假设我有一个名称和ID的数据框

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

我想从另一个数据库解析每个id并获取所需的信息。

   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 个答案:

答案 0 :(得分: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