我正在使用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中遇到xtabs
和ftable
,但我不相信他们提供了最简单的解决方案。部分问题是这些功能将为每个房屋提供号的设备,然后抛弃我的房屋计算比例。这是我目前的做法:
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中有更好的方法可以做到这一点。任何建议都非常感激。
答案 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