匹配变量并使用spread函数重塑数据

时间:2017-11-15 14:04:14

标签: r dplyr matching tidyr

我有一个看起来像这样的数据框(让我们称之为df1)......

Date                Price       Product Key
2014-08-06          10          00020e32-3ae8-b7fa-8ecd53a64715
2014-08-06          56          00020e32-3ae8-b7fa-8ecd53a64715
2014-09-15          81          000340b8-9ee5-b2cb-60fb50bacac8
2014-06-04          73          000340b8-9ee5-b2cb-60fb50bacac8
2015-01-19          44          000458f1-1297-a2fd-9304a2fdb6ae
2015-05-23          20          000458f1-1297-a2fd-9304a2fdb6ae
2014-07-21          0.75        ddc8f2e2-3496-8a71-8d1019d2651c

数据框中还有其他变量,但我们现在会忽略它们,因为我不需要它们。

数据集有许多不同的日期和产品密钥,这只是一个例子。我想要做的是完全匹配具有相同产品密钥的所有产品,然后将具有该产品密钥的所有产品提取到它自己的列中。 (这应该会给我100多个专栏,每列都有自己独特的产品密钥,但也保留各自的日期和价格(以及我未包含的其他变量),然后我可以使用)

我想要的输出看起来如下图所示: output example

正如您所看到的,新列中的每个产品密钥仍然对应于各自的日期/价格/其他变量。显然每列会有两个以上的产品密钥,但这只是一个例子。

我尝试了各种grep函数和dplyr函数,但我似乎没有得到任何结果?对我而言,主要问题是一列内的初始匹配流程,并且能够将产品密钥保存在相关日期和价格旁边。我希望这是有道理的 - 如果我能说得更清楚,请告诉我。

    Date        price_currentday    json_productkey                        pk                 pk_val   

    2014-08-06          10          00020e32-3ae8-b7fa-8ecd53a64715        Product_Key_1      00020e32-3ae8-b7fa-8ecd53a64715  
    2014-08-06          56          00020e32-3ae8-b7fa-8ecd53a64715        Product_Key_1      00020e32-3ae8-b7fa-8ecd53a64715  
    2014-09-15          81          000340b8-9ee5-b2cb-60fb50bacac8        Product_Key_2      000340b8-9ee5-b2cb-60fb50bacac8 
    2014-06-04          73          000340b8-9ee5-b2cb-60fb50bacac8        Product_Key_2      000340b8-9ee5-b2cb-60fb50bacac8 
    2015-01-19          44          000458f1-1297-a2fd-9304a2fdb6ae        Product_Key_3      000458f1-1297-a2fd-9304a2fdb6ae
    2015-05-23          20          000458f1-1297-a2fd-9304a2fdb6ae        Product_Key_3      000458f1-1297-a2fd-9304a2fdb6ae
    2014-07-21          0.75        ddc8f2e2-3496-8a71-8d1019d2651c        Product_Key_4      ddc8f2e2-3496-8a71-8d1019d2651c 

1 个答案:

答案 0 :(得分:1)

df1$pk = paste("Product_Key", as.numeric(factor(
  df1$Product_Key, levels = unique(df1$Product_Key)
)), sep = "_")

df1$pk_val = df1$Product_Key

tidyr::spread(df1, key = pk, value = pk_val)
        Date Price                     Product_Key                   Product_Key_1
# 1 2014-06-04 73.00 000340b8-9ee5-b2cb-60fb50bacac8                            <NA>
# 2 2014-07-21  0.75 ddc8f2e2-3496-8a71-8d1019d2651c                            <NA>
# 3 2014-08-06 10.00 00020e32-3ae8-b7fa-8ecd53a64715 00020e32-3ae8-b7fa-8ecd53a64715
# 4 2014-08-06 56.00 00020e32-3ae8-b7fa-8ecd53a64715 00020e32-3ae8-b7fa-8ecd53a64715
# 5 2014-09-15 81.00 000340b8-9ee5-b2cb-60fb50bacac8                            <NA>
# 6 2015-01-19 44.00 000458f1-1297-a2fd-9304a2fdb6ae                            <NA>
# 7 2015-05-23 20.00 000458f1-1297-a2fd-9304a2fdb6ae                            <NA>
#                     Product_Key_2                   Product_Key_3                   Product_Key_4
# 1 000340b8-9ee5-b2cb-60fb50bacac8                            <NA>                            <NA>
# 2                            <NA>                            <NA> ddc8f2e2-3496-8a71-8d1019d2651c
# 3                            <NA>                            <NA>                            <NA>
# 4                            <NA>                            <NA>                            <NA>
# 5 000340b8-9ee5-b2cb-60fb50bacac8                            <NA>                            <NA>
# 6                            <NA> 000458f1-1297-a2fd-9304a2fdb6ae                            <NA>
# 7                            <NA> 000458f1-1297-a2fd-9304a2fdb6ae                            <NA>

它重新排序您的行,但如果您有可以轻松修复的东西,那么

使用此数据:

df1 = read.table(text = "Date                Price       Product_Key
2014-08-06          10          00020e32-3ae8-b7fa-8ecd53a64715
2014-08-06          56          00020e32-3ae8-b7fa-8ecd53a64715
2014-09-15          81          000340b8-9ee5-b2cb-60fb50bacac8
2014-06-04          73          000340b8-9ee5-b2cb-60fb50bacac8
2015-01-19          44          000458f1-1297-a2fd-9304a2fdb6ae
2015-05-23          20          000458f1-1297-a2fd-9304a2fdb6ae
2014-07-21          0.75        ddc8f2e2-3496-8a71-8d1019d2651c",
                 header = T)

还可以使用相对较旧的tidyr版本0.6.3来处理新数据。

df2 = read.table(text = "Date        price_currentday    json_productkey                        pk                 pk_val   
    2014-08-06          10          00020e32-3ae8-b7fa-8ecd53a64715        Product_Key_1      00020e32-3ae8-b7fa-8ecd53a64715  
    2014-08-06          56          00020e32-3ae8-b7fa-8ecd53a64715        Product_Key_1      00020e32-3ae8-b7fa-8ecd53a64715  
    2014-09-15          81          000340b8-9ee5-b2cb-60fb50bacac8        Product_Key_2      000340b8-9ee5-b2cb-60fb50bacac8 
    2014-06-04          73          000340b8-9ee5-b2cb-60fb50bacac8        Product_Key_2      000340b8-9ee5-b2cb-60fb50bacac8 
    2015-01-19          44          000458f1-1297-a2fd-9304a2fdb6ae        Product_Key_3      000458f1-1297-a2fd-9304a2fdb6ae
    2015-05-23          20          000458f1-1297-a2fd-9304a2fdb6ae        Product_Key_3      000458f1-1297-a2fd-9304a2fdb6ae
    2014-07-21          0.75        ddc8f2e2-3496-8a71-8d1019d2651c        Product_Key_4      ddc8f2e2-3496-8a71-8d1019d2651c",
                 header = T)

tidyr::spread(df2, key = pk, value = pk_val)
#         Date price_currentday                 json_productkey                   Product_Key_1
# 1 2014-06-04            73.00 000340b8-9ee5-b2cb-60fb50bacac8                            <NA>
# 2 2014-07-21             0.75 ddc8f2e2-3496-8a71-8d1019d2651c                            <NA>
# 3 2014-08-06            10.00 00020e32-3ae8-b7fa-8ecd53a64715 00020e32-3ae8-b7fa-8ecd53a64715
# 4 2014-08-06            56.00 00020e32-3ae8-b7fa-8ecd53a64715 00020e32-3ae8-b7fa-8ecd53a64715
# 5 2014-09-15            81.00 000340b8-9ee5-b2cb-60fb50bacac8                            <NA>
# 6 2015-01-19            44.00 000458f1-1297-a2fd-9304a2fdb6ae                            <NA>
# 7 2015-05-23            20.00 000458f1-1297-a2fd-9304a2fdb6ae                            <NA>
#                     Product_Key_2                   Product_Key_3                   Product_Key_4
# 1 000340b8-9ee5-b2cb-60fb50bacac8                            <NA>                            <NA>
# 2                            <NA>                            <NA> ddc8f2e2-3496-8a71-8d1019d2651c
# 3                            <NA>                            <NA>                            <NA>
# 4                            <NA>                            <NA>                            <NA>
# 5 000340b8-9ee5-b2cb-60fb50bacac8                            <NA>                            <NA>
# 6                            <NA> 000458f1-1297-a2fd-9304a2fdb6ae                            <NA>
# 7                            <NA> 000458f1-1297-a2fd-9304a2fdb6ae                            <NA>