gpt4 book ai didi

data.frame 上的重构魔法

转载 作者:行者123 更新时间:2023-12-02 04:55:49 25 4
gpt4 key购买 nike

我目前正在学习使用 data.frame,并且对如何重新排序它们感到非常困惑。

目前,我有一个 data.frame 显示:

  • 第 1 列:商店名称
  • 第 2 列:产品
  • 第3栏:该店铺购买该商品的数量

或者视觉上是这样的:

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

我想要实现的是以下“以商店为中心”的结构:

  • 第 1 列:商店名称
  • 第 2 列:产品 1 的售出商品
  • 第 3 列:产品 2 的售出商品
  • 第 4 列:产品 3 的售出商品...

当特定商店/产品没有排队时(因为没有销售),我想创建一个 0。

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

最佳答案

到目前为止的答案在一定程度上有效,但并没有完全回答您的问题。特别是,它们没有解决没有商店出售特定产品的情况。从您的示例输入和所需输出来看,没有商店出售“Product3”。事实上,“Product3”甚至没有出现在您的源 data.frame 中。此外,它们没有解决每个商店 + 产品组合具有多行的可能情况。

这是您的数据的修改版本以及迄今为止的两个解决方案。我为“Shop1”和“Product1”的组合添加了另一行。请注意,我已将您的产品转换为一个factor 变量,其中包括该变量可以采用的级别,即使没有一个案例实际上具有该级别。

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 来自“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

    什么?突然不行了。改为这样做:

    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. 我们还是老派吧。 cast 来自“reshape”

    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

    呃。又不是你想要的...试试这个:

    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. 让我们回到基础知识。来自基础 R 的 xtabs

    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

    或者,如果您更喜欢 data.frame(请注意,您的“Shop.Name”变量已转换为 data 的 row.names .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

关于data.frame 上的重构魔法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14508199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com