【问题标题】:R programming: Combining Two Data FramesR 编程:组合两个数据帧
【发布时间】:2013-12-19 02:41:59
【问题描述】:

伙计们,

如果您将 2 个数据框 df1 和 df2 连接或合并,我想连接或合并。我的目标很简单,就像创建一个新数据框,其列是 df1 和 df2 的并集。

例子

product=c("p1","p1","p1","p1","p1","p1","p1","p1","p2","p2","p2","p2","p2","p2","p2","p2","p3","p3","p3","p3","p3","p3","p3","p3","p4","p4","p4","p4","p4","p4","p4","p4")
skew=c("b","b","b","b","a","a","a","a","b","b","b","b","a","a","a","a","b","b","b","b","a","a","a","a","b","b","b","b","a","a","a","a")
version=c(0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2)
color=c("C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2")
price=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32)

df1 = data.frame(product, skew, version)
df2 = data.frame(product, skew, color, price)

我的愿望是得到如下结果。

我尝试了几个选项:

#option 1 with cbind
df <- cbind(df1,df2)

这会返回一个数据框重复列“product”和“skew”。

# Option 2, use data.frame
df <- data.frame(df1,df2)

这几乎给了我我想要的东西,除了它有额外的“产品”和“倾斜”列。它们都以“.1”为后缀,因此没有重复。

# option 3, use merge which seems to be the way to go
df <- merge(df1,df2) 

我认为我在合并时遗漏了一些东西,因为这实际上在所有数据集中创建了一个联合,在提供的 32 个观察值中总共产生了 128 个观察值。我想这就是合并的工作原理。我运行了“?merge”并尝试了一些选项,但无法让它吐出我想要的东西。

所以我的问题是:

如上所述从 df1 和 df2 中获取所需数据帧的最佳方法是什么?

提前感谢您的帮助! 里亚德。

     product skew  version color price
1       p1    b     0.1    C1     1
2       p1    b     0.1    C2     2
3       p1    b     0.2    C1     3
4       p1    b     0.2    C2     4
5       p1    a     0.1    C1     5
6       p1    a     0.1    C2     6
7       p1    a     0.2    C1     7
8       p1    a     0.2    C2     8
9       p2    b     0.1    C1     9
10      p2    b     0.1    C2    10
11      p2    b     0.2    C1    11
12      p2    b     0.2    C2    12
13      p2    a     0.1    C1    13
14      p2    a     0.1    C2    14
15      p2    a     0.2    C1    15
16      p2    a     0.2    C2    16
17      p3    b     0.1    C1    17
18      p3    b     0.1    C2    18
19      p3    b     0.2    C1    19
20      p3    b     0.2    C2    20
21      p3    a     0.1    C1    21
22      p3    a     0.1    C2    22
23      p3    a     0.2    C1    23
24      p3    a     0.2    C2    24
25      p4    b     0.1    C1    25
26      p4    b     0.1    C2    26
27      p4    b     0.2    C1    27
28      p4    b     0.2    C2    28
29      p4    a     0.1    C1    29
30      p4    a     0.1    C2    30
31      p4    a     0.2    C1    31
32      p4    a     0.2    C2    32

【问题讨论】:

    标签: r merge dataframe cbind


    【解决方案1】:

    您可以使用union(),但它会弄乱列名。

    df_c <- union(df1, df2)
    names(df_c) <- union(names(df1), names(df2))
    df_c <- as.data.frame(df_c)
    

    【讨论】:

    • 是的,按预期工作。我希望我可以用更少的步骤完成,但它完成了工作!感谢您的及时回答,非常感谢!
    【解决方案2】:

    merge() 无法按您希望的方式工作,因为您的列“product”和“skew”不是唯一标识符。组合出现多次。因此 merge() 计算每个可能的组合。您可以包含第三列作为 id:

    product=c("p1","p1","p1","p1","p1","p1","p1","p1","p2","p2","p2","p2","p2","p2","p2","p2","p3","p3","p3","p3","p3","p3","p3","p3","p4","p4","p4","p4","p4","p4","p4","p4")
    skew=c("b","b","b","b","a","a","a","a","b","b","b","b","a","a","a","a","b","b","b","b","a","a","a","a","b","b","b","b","a","a","a","a")
    version=c(0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2,0.1,0.1,0.2,0.2)
    color=c("C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2","C1","C2")
    price=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32)
    id = 1:32
    
    df1 = data.frame(product, skew, id, version)
    df2 = data.frame(product, skew, id, color, price)
    merge(df1, df2)
    

    或者你手动合并你的data.frames:

    cbind(df1, df2[, 3:4])
    

    【讨论】:

    • 非常感谢。我选择了第二个选项,因为我真的不知道我有多少行,32 只是一个例子,但可能会有所不同。此外,在 cbind 中,我宁愿使用该名称。因此,根据您的 cmets,我运行了:cbind(df1, df2[, c("price","color")]),它完成了这项工作!再次感谢您的及时答复
    猜你喜欢
    • 2019-03-29
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2015-03-16
    相关资源
    最近更新 更多