用于“左连接”两个数据帧的惯用 R 方法

Posted

技术标签:

【中文标题】用于“左连接”两个数据帧的惯用 R 方法【英文标题】:Idiomatic R method for "left joining" two data frames 【发布时间】:2011-04-21 18:20:06 【问题描述】:

我有两个数据框,它们都有一个包含如下因素的列:

> head(test.data)
      var0     var1       date  store
1 109.5678 109.5678 1990-03-30 Store1
2 109.3009 108.4261 1990-06-30 Store1
3 108.8262 106.2517 1990-09-30 Store1
4 108.2443 108.6417 1990-12-30 Store1
5 109.5678 109.5678 1991-03-30 Store1
6 109.3009 108.4261 1991-06-30 Store1
> summary(test.data)
      var0             var1              date                store   
 Min.   : -9.72   Min.   : -2.297   Min.   :1990-03-30   Store1 : 8  
 1st Qu.: 68.32   1st Qu.: 71.305   1st Qu.:1990-09-07   Store2 : 8  
 Median :102.19   Median :101.192   Median :1991-02-13   Store3 : 8  
 Mean   :101.09   Mean   :103.042   Mean   :1991-02-13   Store4 : 8  
 3rd Qu.:151.22   3rd Qu.:151.940   3rd Qu.:1991-07-23   Store5 : 8  
 Max.   :196.55   Max.   :201.099   Max.   :1991-12-30   Store6 : 8  
                                                         (Other):48  
>
> head(test.clusters)
   store cluster
1 Store1       A
2 Store2       C
3 Store3       A
4 Store4       B
5 Store5       D
6 Store6       A
>
> summary(test.clusters)
     store   cluster
 Store1 :1   A:5    
 Store2 :1   B:4    
 Store3 :1   C:2    
 Store4 :1   D:1    
 Store5 :1          
 Store6 :1          
 (Other):6          
> 

我想根据共享的storetest.data 添加一列,其中包含每一行的cluster。我目前正在使用双重嵌套循环来执行此操作:

new_col <- rep(test.clusters$cluster[1], length(test.data$store))
for (i in seq(test.data$store))
  for (j in seq(test.clusters$store))
    if (test.data$store[i] == test.clusters$store[j])
      new_col[i] <- test.clusters$cluster[j]
      break
           
  

test.data$cluster <- new_col

这非常冗长,效率极低,坦率地说很难看。在 R 中这样做的惯用方法是什么?

【问题讨论】:

【参考方案1】:

使用merge函数。

【讨论】:

+1 参见 ***.com/questions/3515611/merge-command-in-r 和 ***.com/questions/2232699/… 例如,或在网站上搜索“merge [r]”。 我会调查一下 - 不知道要搜索什么关键字!【参考方案2】:

我推荐match。它会比merge快得多。

应该是这样的:

test.data$cluster <- test.clusters$cluster[match(test.data$store, test.clusters$store)]

【讨论】:

【参考方案3】:

使用plyr 中的join 函数。它在内部使用匹配,所以应该很快(比合并快 4-10 倍)。

【讨论】:

请注意,这只适用于当前版本的 plyr。如果您因任何原因被困在旧版本的 R 上,这将不是一个选择。

以上是关于用于“左连接”两个数据帧的惯用 R 方法的主要内容,如果未能解决你的问题,请参考以下文章

左连接并在R中及时选择下一个观察

R语言merge函数左连接dataframe数据(Left (outer) join in R)左连接必须将参数all设置(all.x = TRUE)默认merge函数通过公共列名合并数据集

mysql左连接和右连接的区别

两个数据表左右连接

R语言data.table导入数据实战:data.table进行多表数据连接(mergejoin)内连接左连接外连接

数据库操作中,左连接,右连接是啥意思,举例说明