聚合 R 中多列的频率
Aggregating frequencies with multiple columns in R
我正在使用 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 中的烤面包机)。
作为显示我正在尝试计算的示例,在此处显示的数据中,拥有烤面包机的房屋比例为 0.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 中有更好的方法来做到这一点。非常感谢任何建议。
library(data.table)
setDT(df)
n.houses = length(unique(df$House))
df[, length(unique(House))/n.houses, by = Appliance]
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
我正在使用 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 中的烤面包机)。
作为显示我正在尝试计算的示例,在此处显示的数据中,拥有烤面包机的房屋比例为 0.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 中有更好的方法来做到这一点。非常感谢任何建议。
library(data.table)
setDT(df)
n.houses = length(unique(df$House))
df[, length(unique(House))/n.houses, by = Appliance]
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