[英]R generate list in data.frame from unique pairs
我有一个购买历史记录的csv文件 - 项目,日期,价格,供应商等等。 我想生成一个包含1项的2列表,以及提供该项的所有供应商。 删除无关列的初始处理为每个事务留下了一行项目和供应商对。
> vendorTable <- data.frame("Item" = sample(c("Item_A", "Item_B", "Item_B_raw", "Item C", "Item 4"), 40, replace =T),"Vendors" = sample(c("Vendor_1", "Vendor_2", "Vendor 3", "Vendor4", "Vendor 5."))
stringsAsFactors - FALSE)
> vendorTable
Item Vendors
1 Item_B Vendor 3
2 Item_B Vendor4
3 Item_B_raw Vendor_2
4 Item 4 Vendor 5.
5 Item_A Vendor_1
6 Item_A Vendor 3
7 Item_A Vendor4
8 Item C Vendor_2
9 Item_A Vendor 5.
10 Item_B_raw Vendor_1
11 Item_A Vendor 3
12 Item C Vendor4
13 Item_B Vendor_2
14 Item C Vendor 5.
15 Item 4 Vendor_1
16 Item C Vendor 3
17 Item_B_raw Vendor4
18 Item_B Vendor_2
19 Item_B_raw Vendor 5.
20 Item_B Vendor_1
然后可以用unique()
> vendorTable <- unique(vendorTable)
> vendorTable
Item Vendors
1 Item_B Vendor 3
2 Item_B Vendor4
3 Item_B_raw Vendor_2
4 Item 4 Vendor 5.
5 Item_A Vendor_1
6 Item_A Vendor 3
7 Item_A Vendor4
8 Item C Vendor_2
9 Item_A Vendor 5.
10 Item_B_raw Vendor_1
12 Item C Vendor4
13 Item_B Vendor_2
14 Item C Vendor 5.
15 Item 4 Vendor_1
16 Item C Vendor 3
17 Item_B_raw Vendor4
19 Item_B_raw Vendor 5.
20 Item_B Vendor_1
21 Item 4 Vendor 3
22 Item 4 Vendor4
23 Item 4 Vendor_2
26 Item_B_raw Vendor 3
30 Item C Vendor_1
34 Item_B Vendor 5.
这就是我被卡住的地方。 我知道你可以在数据框列中有一个列表,
>df <- data.frame(x = 1:3)
>df$y <- list(1:2, 1:3, 1:4)
>df
x y
1 1 1, 2
2 2 1, 2, 3
3 3 1, 2, 3, 4
但是如何从我所在的地方,到我想去的地方:
Item Vendor
Item_A Vendor_1, Vendor 3, Vendor4
Item_B Vendor_2, Vendor 3, Vendor4, Vendor 5.
etc.
超出了我目前的技能,搜索导致了许多死胡同。 我怀疑我会因为答案的简单而感到尴尬,但这就是生活。
aggregate(.~Item,vendorTable,function(x)as.character(x))
Item Vendors
1 Item 4 Vendor_1, Vendor4, Vendor_1, Vendor4, Vendor 5., Vendor_1, Vendor 3
2 Item C Vendor_2, Vendor 3, Vendor_2, Vendor4, Vendor 5., Vendor_2, Vendor4, Vendor_2, Vendor 5., Vendor 5.
3 Item_A Vendor4, Vendor_1, Vendor 3, Vendor_1, Vendor 5., Vendor_2, Vendor_1, Vendor_1
4 Item_B Vendor 5., Vendor 3, Vendor 5., Vendor_1, Vendor4, Vendor_2
5 Item_B_raw Vendor_2, Vendor4, Vendor_2, Vendor 3, Vendor 3, Vendor 3, Vendor 5., Vendor 3, Vendor4
有了tidyverse
,我们可以nest
library(tidyverse)
vendorTable %>%
nest(Vendors, .key = Vendors)
# Item Vendors
#1 Item_B Vendor 3, Vendor4, Vendor_2, Vendor_2, Vendor_1
#2 Item_B_raw Vendor_2, Vendor_1, Vendor4, Vendor 5.
#3 Item 4 Vendor 5., Vendor_1
#4 Item_A Vendor_1, Vendor 3, Vendor4, Vendor 5., Vendor 3
#5 Item C Vendor_2, Vendor4, Vendor 5., Vendor 3
或者使用summarise
和list
vendorTable %>%
group_by(Item) %>%
summarise(Vendors = list(Vendors))
# A tibble: 5 x 2
# Item Vendors
# <chr> <list>
#1 Item 4 <chr [2]>
#2 Item C <chr [4]>
#3 Item_A <chr [5]>
#4 Item_B <chr [5]>
#5 Item_B_raw <chr [4]>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.