我有一个包含一些分类变量+一个“集群”变量的数据集。例如:
time <- c("Morning", "Evening" ,"Morning", "Morning", "Afternoon", "Evening", "Afternoon")
dollar <- c("1-5", "6-10", "11-15", "1-5", "1-5", "6-10", "6-10")
with_kids <- c("no", "yes", "yes", "no", "no", "yes", "yes")
cluster <- c(1,1,2,3,2,2,3)
data <- cbind(time, dollar, with_kids, cluster)
如何通过“集群”创建所有类别变量的频率表?
期望的输出是右边的表(每个集群中每个分类变量的列%)。
我知道这段代码只适用于一个变量。如果我有更多的绝对变量,那么最有效的方法是什么?
table(data$time, data$cluster)
发布于 2017-07-27 15:41:42
我不完全确定你想要的输出,但这里有两种可能性。
表表清单:
myList <- lapply(dat[head(names(dat), -1)], table, dat$cluster)
myList
$time
1 2 3
Afternoon 0 1 1
Evening 1 1 0
Morning 1 1 1
$dollar
1 2 3
1-5 1 1 1
11-15 0 1 0
6-10 1 1 1
$with_kids
1 2 3
no 1 1 1
yes 1 2 1
要获得比例表的列表,可以使用lapply
作为函数对表列表进行prop.table
,并向其提供margin=2
lapply(myList, prop.table, margin=2)
$time
1 2 3
Afternoon 0.0000000 0.3333333 0.5000000
Evening 0.5000000 0.3333333 0.0000000
Morning 0.5000000 0.3333333 0.5000000
$dollar
1 2 3
1-5 0.5000000 0.3333333 0.5000000
11-15 0.0000000 0.3333333 0.0000000
6-10 0.5000000 0.3333333 0.5000000
$with_kids
1 2 3
no 0.5000000 0.3333333 0.5000000
yes 0.5000000 0.6666667 0.5000000
把他们重新绑在一起
do.call(rbind, lapply(dat[head(names(dat), -1)], table, dat$cluster))
1 2 3
Afternoon 0 1 1
Evening 1 1 0
Morning 1 1 1
1-5 1 1 1
11-15 0 1 0
6-10 1 1 1
no 1 1 1
yes 1 2 1
数据
dat <-
structure(list(time = structure(c(3L, 2L, 3L, 3L, 1L, 2L, 1L), .Label = c("Afternoon",
"Evening", "Morning"), class = "factor"), dollar = structure(c(1L,
3L, 2L, 1L, 1L, 3L, 3L), .Label = c("1-5", "11-15", "6-10"), class = "factor"),
with_kids = structure(c(1L, 2L, 2L, 1L, 1L, 2L, 2L), .Label = c("no",
"yes"), class = "factor"), cluster = c(1, 1, 2, 3, 2, 2,
3)), .Names = c("time", "dollar", "with_kids", "cluster"), row.names = c(NA,
-7L), class = "data.frame")
发布于 2017-07-27 15:08:43
time <- c("Morning", "Evening" ,"Morning", "Morning", "Afternoon", "Evening", "Afternoon")
dollar <- c("1-5", "6-10", "11-15", "1-5", "1-5", "6-10", "6-10")
with_kids <- c("no", "yes", "yes", "no", "no", "yes", "yes")
cluster <- c(1,1,2,3,2,2,3)
data <- data.frame(time, dollar, with_kids, cluster)
您可以使用dplyr
包并选择任意数量的变量。
library(dplyr)
data %>%
group_by(interaction(time, cluster, dollar)) %>%
summarise(count = n())
# A tibble: 7 x 2
`interaction(time, cluster, dollar)` count
<fctr> <int>
1 Morning.1.1-5 1
2 Afternoon.2.1-5 1
3 Morning.3.1-5 1
4 Morning.2.11-15 1
5 Evening.1.6-10 1
6 Evening.2.6-10 1
7 Afternoon.3.6-10 1
https://stackoverflow.com/questions/45354436
复制相似问题