将两个不同维度的数据帧组合到一个数据帧

时间:2013-12-11 07:32:11

标签: r

我有一个问题是要合并两个不同的维度数据框,每个数据框都有很大的行。比方说,我的数据帧的样本是d和e,新的预期数据帧是de。我想在d和e中的同一行中的所有值之间进行配对,并在新的数据帧(de)中构造这些对。任何想法/帮助解决我的问题真的很感激。感谢

> d <- data.frame(v1 = c(1,3,5), v2 = c(2,4,6))
> d
  v1 v2
1  1  2
2  3  4
3  5  6

> e <- data.frame(v1 = c(11, 14), v2 = c(12,15), v3=c(13,16))
> e
  v1 v2 v3
1 11 12 13
2 14 15 16


> de <- data.frame(x = c(1,1,1,2,2,2,3,3,3,4,4,4), y = c(11,12,13,11,12,13,14,15,16,14,15,16))
> de
   x  y
1  1 11
2  1 12
3  1 13
4  2 11
5  2 12
6  2 13
7  3 14
8  3 15
9  3 16
10 4 14
11 4 15
12 4 16

2 个答案:

答案 0 :(得分:2)

一种解决方案是将d和e“融化”成长格式,然后合并,然后去掉额外的列。如果您有非常大的数据集,那么数据表会快得多(这个小数据集没有区别)。

library(reshape2)   # for melt(...)
library(data.table)
# add id column
d <- cbind(id=1:nrow(d),d)
e <- cbind(id=1:nrow(e),e)
# melt to long format
d.melt <- data.table(melt(d,id.vars="id"), key="id")
e.melt <- data.table(melt(e,id.vars="id"), key="id")
# data table join, remove extra columns
result <- d.melt[e.melt, allow.cartesian=T]
result[,":="(id=NULL,variable=NULL,variable.1=NULL)]
setnames(result,c("x","y"))
setkey(result,x,y)
result
    x  y
 1: 1 12
 2: 1 13
 3: 1 14
 4: 2 12
 5: 2 13
 6: 2 14
 7: 3 15
 8: 3 16
 9: 3 17
10: 4 15
11: 4 16
12: 4 17

答案 1 :(得分:1)

如果您的数据是数字的,就像在这个例子中一样,这在基数R中也非常简单。从概念上讲,这与@ jlhoward的答案相同:将数据转换为长格式并合并:

merge(cbind(id = rownames(d), stack(d)), 
      cbind(id = rownames(e), stack(e)), 
      by = "id")[c("values.x", "values.y")]
#    values.x values.y
# 1         1       11
# 2         1       12
# 3         1       13
# 4         2       11
# 5         2       12
# 6         2       13
# 7         3       14
# 8         3       15
# 9         3       16
# 10        4       14
# 11        4       15
# 12        4       16

或者,使用“reshape2”包:

merge(melt(as.matrix(d)), 
      melt(as.matrix(e)), 
      by = "Var1")[c("value.x", "value.y")]