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

Matching on a variable and using the spread function to reshape data

我有一个看起来像这样的数据框(我们称之为 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 多列,每列都有自己唯一的产品密钥,但也保留各自的日期和价格(以及我没有包含的其他变量),然后我可以使用它们)

我想要的输出如下图所示:

如您所见,新列中的每个产品密钥仍然对应于各自的 dates/price/other 变量。显然每列会有两个以上的产品密钥,但这只是一个例子。

我已经尝试了各种 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 
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>