用于“左连接”两个数据帧的惯用 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
>
我想根据共享的store
向test.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语言merge函数左连接dataframe数据(Left (outer) join in R)左连接必须将参数all设置(all.x = TRUE)默认merge函数通过公共列名合并数据集