在R中聚合具有多个列的频率

时间:2015-08-22 16:21:19

标签: r frequency

我正在使用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(例如,房子1中的烤面包机),或者可以列出两次(每个都有计数= 1,例如,房子2中的烤面包机)

作为一个显示我想要计算的例子,在这里显示的数据中,带有烤面包机的房屋比例为.67(四舍五入),因为2/3的房屋至少有一个烤面包机。同样,带烤箱的房屋比例为0.33(因为只有1/3的房子有烤箱)。我不在乎任何一个房子都有多个烤面包机 - 只有它们至少有一个。

我在R中遇到xtabsftable,但我不相信他们提供了最简单的解决方案。部分问题是这些功能将为每个房屋提供的设备,然后抛弃我的房屋计算比例。这是我目前的做法:

    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中有更好的方法可以做到这一点。任何建议都非常感激。

2 个答案:

答案 0 :(得分:1)

library(data.table)
setDT(df)

n.houses = length(unique(df$House))
df[, length(unique(House))/n.houses, by = Appliance]

答案 1 :(得分:1)

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