2013-01-24 26 views
6

Tôi hiện đang học cách làm việc với data.frame và khá bối rối về cách sắp xếp lại chúng.Phép chiếu lại dữ liệu trên data.frame

Tại thời điểm này, tôi có một data.frame cho thấy:

  • cột 1: một tên cửa hàng
  • cột 2: một sản phẩm
  • cột 3: số lượng mua đối với sản phẩm này bởi cửa hàng này

hoặc thị một cái gì đó như thế này:

+---+-----------+-------+----------+--+ 
| | Shop.Name | Items | Product | | 
+---+-----------+-------+----------+--+ 
| 1 | Shop1  |  2 | Product1 | | 
| 2 | Shop1  |  4 | Product2 | | 
| 3 | Shop2  |  3 | Product1 | | 
| 4 | Shop3  |  2 | Product1 | | 
| 5 | Shop3  |  1 | Product4 | | 
+---+-----------+-------+----------+--+ 

Những gì tôi muốn đạt được như sau "cửa hàng làm trung tâm" cấu trúc:

  • cột 1: một tên cửa hàng
  • cột 2: Items được bán với giá Product1
  • cột 3: Items được bán với giá PRODUCT2
  • cột 4: Items được bán với giá product3 ...

Khi không có đường cho một cửa hàng/sản phẩm cụ thể (vì không bán hàng), tôi muốn tạo một 0.

hoặc

+---+-------+-------+-------+-------+-------+-----+--+--+ 
| | Shop | Prod1 | Prod2 | Prod3 | Prod4 | ... | | | 
+---+-------+-------+-------+-------+-------+-----+--+--+ 
| 1 | Shop1 |  2 |  4 |  0 |  0 | ... | | | 
| 2 | Shop2 |  3 |  0 |  0 |  0 | ... | | | 
| 3 | Shop3 |  2 |  0 |  0 |  1 | ... | | | 
+---+-------+-------+-------+-------+-------+-----+--+--+ 
+3

Có một hãy xem hàm 'reshape' hoặc' dcast' trong gói ** reshape2 **. – joran

+0

http://stackoverflow.com/a/9617424/210673 có một danh sách dài các cách để thực hiện việc này. – Aaron

Trả lời

12

Những câu trả lời cho đến nay làm việc ở một mức độ nhất định, nhưng không trả lời đầy đủ câu hỏi của bạn. Đặc biệt, họ không giải quyết vấn đề của một trường hợp trong đó không có cửa hàng nào bán một sản phẩm cụ thể. Từ đầu vào ví dụ của bạn và đầu ra mong muốn, không có cửa hàng nào bán "Product3". Thật vậy, "Product3" thậm chí không xuất hiện trong nguồn của bạn data.frame. Ngoài ra, họ không giải quyết tình huống có thể có nhiều hàng cho mỗi kết hợp Cửa hàng + Sản phẩm.

Đây là phiên bản đã sửa đổi của dữ liệu của bạn và hai giải pháp cho đến thời điểm này. Tôi đã thêm một hàng khác cho kết hợp "Shop1" và "Product1". Lưu ý rằng tôi đã chuyển đổi sản phẩm của bạn thành biến số factor bao gồm các cấp mà biến có thể thực hiện, ngay cả khi không có trường hợp nào thực sự có cấp đó.

mydf <- data.frame(
    Shop.Name = c("Shop1", "Shop1", "Shop2", "Shop3", "Shop3", "Shop1"), 
    Items = c(2, 4, 3, 2, 1, 2), 
    Product = factor(
    c("Product1", "Product2", "Product1", "Product1", "Product4", "Product1"), 
    levels = c("Product1", "Product2", "Product3", "Product4"))) 
  1. dcast từ "reshape2"

    library(reshape2) 
    dcast(mydf, formula = Shop.Name ~ Product, value="Items", fill=0) 
    # Using Product as value column: use value.var to override. 
    # Aggregation function missing: defaulting to length 
    # Error in .fun(.value[i], ...) : 
    # 2 arguments passed to 'length' which requires 1 
    

    Wha? Đột nhiên không hoạt động. Thực hiện việc này thay thế:

    dcast(mydf, formula = Shop.Name ~ Product, 
         fill = 0, value.var = "Items", 
         fun.aggregate = sum, drop = FALSE) 
    # Shop.Name Product1 Product2 Product3 Product4 
    # 1  Shop1  4  4  0  0 
    # 2  Shop2  3  0  0  0 
    # 3  Shop3  2  0  0  1 
    
  2. Hãy là oldschool.cast từ "định hình lại"

    library(reshape) 
    cast(mydf, formula = Shop.Name ~ Product, value="Items", fill=0) 
    # Aggregation requires fun.aggregate: length used as default 
    # Shop.Name Product1 Product2 Product4 
    # 1  Shop1  2  1  0 
    # 2  Shop2  1  0  0 
    # 3  Shop3  1  0  1 
    

    Eh. Không phải những gì bạn muốn một lần nữa ... Hãy thử thay thế này: Hãy thử thay thế này:

    cast(mydf, formula = Shop.Name ~ Product, 
        value = "Items", fill = 0, 
        add.missing = TRUE, fun.aggregate = sum) 
    # Shop.Name Product1 Product2 Product3 Product4 
    # 1  Shop1  4  4  0  0 
    # 2  Shop2  3  0  0  0 
    # 3  Shop3  2  0  0  1 
    
  3. Hãy quay lại vấn đề cơ bản. xtabs từ cơ sở R

    xtabs(Items ~ Shop.Name + Product, mydf) 
    #   Product 
    # Shop.Name Product1 Product2 Product3 Product4 
    #  Shop1  4  4  0  0 
    #  Shop2  3  0  0  0 
    #  Shop3  2  0  0  1 
    

    Hoặc, nếu bạn thích một data.frame (lưu ý rằng "Shop.Name" biến của bạn đã được chuyển đổi sang row.names của data.frame):

    as.data.frame.matrix(xtabs(Items ~ Shop.Name + Product, mydf)) 
    #  Product1 Product2 Product3 Product4 
    # Shop1  4  4  0  0 
    # Shop2  3  0  0  0 
    # Shop3  2  0  0  1 
    
+1

Đây là một chút toàn diện hơn so với các giải pháp khác được đăng trong http://stackoverflow.com/questions/9617348/reshape-three-column-data-frame-to-matrix –

+0

@Anando Mahto, tôi đang xử lý cùng một vấn đề Tôi có thời gian để trả lời câu hỏi của tôi, tôi sẽ rất tuyệt vời. trong tên tập dữ liệu của tôi là userid là duy nhất và ví dụ tôi muốn xem như một hàng đầu tiên nếu userid = 5.how tôi có thể làm điều đó? Rất cám ơn trước –

1

Sử dụng dcast từ reshape2 thư viện:

library(reshape2) 

> df <- data.frame(Shop.Name=rep(c("Shop1","Shop2","Shop3"),each=3), 
+     Items=rpois(9,5), 
+     Product=c(rep(c("Prod1","Prod2","Prod3","Prod4"),2),"Prod5") 
+) 
> df 
    Shop.Name Items Product 
1  Shop1  6 Prod1 
2  Shop1  5 Prod2 
3  Shop1  6 Prod3 
4  Shop2  5 Prod4 
5  Shop2  6 Prod1 
6  Shop2  6 Prod2 
7  Shop3  4 Prod3 
8  Shop3  7 Prod4 
9  Shop3  5 Prod5 
> dcast(df,Shop.Name ~ Product,value.var="Items",fill=0) 
    Shop.Name Prod1 Prod2 Prod3 Prod4 Prod5 
1  Shop1  6  5  6  0  0 
2  Shop2  6  6  0  5  0 
3  Shop3  0  0  4  7  5 
+0

Không hoàn toàn. Xem [câu trả lời của tôi] (http://stackoverflow.com/a/14515736/1270695). – A5C1D2H2I1M1N2O1R2T1

0

Nếu bạn muốn sử dụng gói Reshape ban đầu cho bất cứ lý do:

Shop.Name <- c("Shop1", "Shop1", "Shop2", "Shop3", "Shop3") 
Items <- c(2,4,3,2,1) 
Product <- c("Product1", "Product2", "Product1", "Product1", "Product4") 
(df <- data.frame(Shop.Name, Items, Product)) 

cast(df, formula = Shop.Name ~ Product, value="Items", fill=0)