匹配变量并使用扩展函数重塑数据
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>
我有一个看起来像这样的数据框(我们称之为 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>