将两个不相等的数据帧融合为R中的一个

时间:2014-09-19 08:48:16

标签: r dataframe melt

我有两个这样的excel文件,我导入为数据框

x   title1   title2                 x  title3
1    x          y                   1    j
2    a          b                   2    m
3    i          j                   3    y
4    m          n          

我想将这些数据框融合成一个这样的数据框

1   title1  x           
2   title1  a           
3   title1  i           
4   title1  m
1   title2  y
2   title2  b
3   title2  j
4   title2  n
1   title3  j
2   title3  m
3   title3  y

我应该使用ggplot绘制最终数据框的图,我知道如何使用ggplot但我有点困惑如何将两个不相等的数据框融合为一个 我感谢任何帮助

2 个答案:

答案 0 :(得分:1)

这里有一种方法。

library(reshape2)
library(dplyr) 

id <- 1:4
t1 <- c("x","a","i","m")
t2 <- c("y", "b", "j", "n")
foo <- data.frame(id, t1, t2, stringsAsFactors = FALSE)

id <- 1:3
t3 <- c("j","m","y")
foo2 <- data.frame(id, t3, stringsAsFactors = FALSE)

foo %>%
    merge(., foo2, by = "id", all = TRUE) %>%
    melt(., id.vars = "id") %>%
    filter(!value %in% NA)

   id variable value
1   1       t1     x
2   2       t1     a
3   3       t1     i
4   4       t1     m
5   1       t2     y
6   2       t2     b
7   3       t2     j
8   4       t2     n
9   1       t3     j
10  2       t3     m
11  3       t3     y

答案 1 :(得分:1)

data.frame放入list并融化它们。使用@ jazzurro的示例数据,尝试:

melt(list(foo, foo2), id.vars = "id")
#    id variable value L1
# 1   1       t1     x  1
# 2   2       t1     a  1
# 3   3       t1     i  1
# 4   4       t1     m  1
# 5   1       t2     y  1
# 6   2       t2     b  1
# 7   3       t2     j  1
# 8   4       t2     n  1
# 9   1       t3     j  2
# 10  2       t3     m  2
# 11  3       t3     y  2

更酷,因为它为您提供了另一列中的原始data.frame名称,就是将mgetls结合使用上述方法:

melt(mget(ls(pattern = "foo")), id.vars = "id")
#    id variable value   L1
# 1   1       t1     x  foo
# 2   2       t1     a  foo
# 3   3       t1     i  foo
# 4   4       t1     m  foo
# 5   1       t2     y  foo
# 6   2       t2     b  foo
# 7   3       t2     j  foo
# 8   4       t2     n  foo
# 9   1       t3     j foo2
# 10  2       t3     m foo2
# 11  3       t3     y foo2