【问题标题】:Aggregating frequencies with multiple columns in R在 R 中使用多列聚合频率
【发布时间】:2015-08-22 16:21:19
【问题描述】:

我正在使用 R 中的一个数据框,该数据框包含三列:House、Appliance 和 Count。这些数据本质上是一个街区每间房屋中包含的不同类型厨房用具的清单。数据如下所示:(为说明目的添加了空格)

    House        Appliance        Count
    1            Toaster          2

    2            Dishwasher       1
    2            Toaster          1
    2            Refrigerator     1
    2            Toaster          1

    3            Dishwasher       1
    3            Oven             1

对于每种电器类型,我希望能够计算出至少包含其中一种电器的房屋比例。请注意,在我的数据中,单个房屋可能在一个类别中有零个、一个或多个设备。如果房屋没有设备,则不会在该房屋的数据中列出。如果房子有不止一个电器,该电器可以列出一次,计数 > 1(例如,House 1 中的烤面包机),或者它可以列出两次(每个计数 = 1,例如,House 2 中的烤面包机)。

作为一个显示我要计算的示例,在此处显示的数据中,带有烤面包机的房屋比例为 0.67(四舍五入),因为 2/3 的房屋至少有一个烤面包机。同样,有烤箱的房屋比例为 0.33(因为只有 1/3 的房屋有烤箱)。我不在乎任何房子有不止一个烤面包机——只要他们至少有一个。

我在 R 中使用了 xtabsftable,但我不相信它们能提供最简单的解决方案。部分问题是这些函数将为每个房子提供 number 的电器,然后抛出我的房子比例计算。这是我目前的方法:

    temp1 <- xtabs(~House + Appliance, data=housedata)
    temp1[temp1[,] > 1] <- 1  # This is needed to correct houses with >1 unit.
    proportion.of.houses <- data.frame(margin.table(temp1,2)/3)

这似乎可行,但并不优雅。我猜在 R 中有更好的方法来做到这一点。任何建议都非常感谢。

【问题讨论】:

    标签: r frequency


    【解决方案1】:
    library(data.table)
    setDT(df)
    
    n.houses = length(unique(df$House))
    df[, length(unique(House))/n.houses, by = Appliance]
    

    【讨论】:

      【解决方案2】:
      library(dplyr)
      n <- length(unique(df$House)) 
      df %>% 
        group_by(Appliance) %>% 
        summarise(freq = n_distinct(House)/n)
      

      输出:

           Appliance      freq
      1   Dishwasher 0.6666667
      2         Oven 0.3333333
      3 Refrigerator 0.3333333
      4      Toaster 0.6666667
      

      【讨论】:

        猜你喜欢
        • 2021-02-24
        • 2020-09-10
        • 1970-01-01
        • 1970-01-01
        • 2020-09-18
        • 1970-01-01
        • 1970-01-01
        • 2013-03-08
        • 1970-01-01
        相关资源
        最近更新 更多