繁体   English   中英

R从唯一对生成data.frame中的列表

[英]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

或者使用summariselist

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM