right_join和mutate不会保留R中的索引

问题描述

我正在将column_data映射到master,并且如果主@R_502_6274@中存在列值,则将其保存为密钥
例如:{{1}的ParentP的{​​{1}}

问题是我正在获取输出,但是输出的索引不同

数据

Child
C

代码

column_data <- c("","","P","C","C")

这应该是输出

master  <- list("Parent" = c("P"),"Child" = c("C")
               )

但是相反,我将其作为输出

library(dplyr)


df <- data.frame("column" = column_data)
df <-stack(master) %>% 
     type.convert(as.is = TRUE) %>%
     right_join(df,by = c('values' = 'column')) %>%
     mutate(output = coalesce(ind,values))

解决方法

对于dplyr,如果您执行right_join(x,y),则结果将包括x的匹配行的子集,然后是y的不匹配行的子集。

从R文档中有关变异联接的文档中,返回的值为:

与x具有相同类型的对象。的行和列的顺序 x尽可能保留。输出具有以下内容 属性:

对于inner_join(),是x行的子集。对于left_join(),所有x行。对于 right_join(),x行的子集,后跟不匹配的y行。对于 full_join(),全部x行,后跟不匹配的y行。

这就是为什么在结果data.frame的开头有3个匹配的行。

要获得期望的结果并保留df的行顺序,请尝试使用left_join,如下所示:

df2 <- stack(master) %>% 
  type.convert(as.is = TRUE) 

df %>%
  left_join(df2,by = c('column' = 'values')) %>%
  mutate(output = coalesce(ind,column))

输出

   column    ind output
1           <NA>       
2           <NA>       
3           <NA>       
4           <NA>       
5           <NA>       
6           <NA>       
7           <NA>       
8           <NA>       
9           <NA>       
10          <NA>       
11          <NA>       
12          <NA>       
13          <NA>       
14          <NA>       
15          <NA>       
16          <NA>       
17      P Parent Parent
18      C  Child  Child
19      C  Child  Child