R数据框,如何将不完整的因素合并到更大的数据框列中?

R data frames, how to merge incomplete factor into larger data frame column?

我没有发现这里讨论的这个问题。

我经常处理 R 中的稀疏数据帧(大量缺失值)。我还需要将新数据合并到 'master' df 中,而且新数据也几乎总是稀疏的。

"old school"方法好像是: 1.在master中新建一列NAs; 2.交叉索引两个数据帧之间的键。 3. 使用索引,仅将来自匹配键的新数据值插入到主数据库中。

这种方法似乎适用于数字和字符列。

## master data frame                                                                                                                                                                                              
master = data.frame( id = 1:20, a = rnorm(20) )
master

## what you need to add                                                                                                                                                                                           
new.data = data.frame( id = 2 * 1:10, b = c(rep('a', 5), 
   rep('b', 5) ) )
new.data

## works for character, numeric                                                                                                                                                                    
try1 = master
ind = match( new.data$id, try1$id )
try1$b = NA
try1[ind, 'b'] = new.data$b
try1
str(try1)

但是,当新数据是一个因子时,这会失败:在插入过程中,因子信息会丢失,并添加因子的数字表示。

## what you need to add is a factor                                                                                                                                                                                         
new.data = data.frame( id = 2 * 1:10, b = factor( c(rep('a', 5), 
     rep('b', 5) ), ordered = TRUE ) )
new.data

## works for character, numeric                                                                                                                                                                                   
## not factors                                                                                                                                                                                                    
try1 = master
ind = match( new.data$id, try1$id )
try1$b = NA
try1[ind, 'b'] = new.data$b
str(try1$b)

当然,可以在主数据框中重新创建该因子,但这既费力又容易出错。寻找一个优雅的,或者至少不丑陋的解决方案。

您可以使用 dplyr 包中的 left_join

master %>%
  left_join(new.data, by = "id")