我只需要为一个有多个选择的问题做一个交叉表。
我有一个调查结果。这样做的目的是看到知道Brand1的人也知道其他品牌的人的份额。
可以说我们有一个包含答案的输入表:
Id Brand1 Brand2 Brand3 Brand4
1 1 1 0 1
2 0 0 1 1
3 1 1 0 0
4 1 0 0 1
5 0 0 1 1
6 0 0 1 0
7 1 1 0 1
我们制作了一个交叉表,列出了每个品牌的答案总和:
Brand1 Brand2 Brand3 Brand4
Brand1 4 3 0 3
Brand2 3 3 0 2
Brand3 0 0 3 2
Brand4 3 2 2 5
然后从了解每个品牌的所有人中计算出列百分比:
Brand1 Brand2 Brand3 Brand4
Brand1 100% 100% 0% 60%
Brand2 75% 100% 0% 40%
Brand3 0% 0% 100% 40%
Brand4 75% 67% 67% 100%
答案 0 :(得分:1)
nm = names(d)[-1]
m1 = sapply(nm, function(x) sapply(nm, function(y) sum(d[x] == 1 & d[y] == 1)))
m1
# Brand1 Brand2 Brand3 Brand4
#Brand1 4 3 0 3
#Brand2 3 3 0 2
#Brand3 0 0 3 2
#Brand4 3 2 2 5
m2 = 100 * sapply(nm, function(x) sapply(nm, function(y)
sum(d[x] == 1 & d[y] == 1)/sum(d[x] == 1)))
m2
# Brand1 Brand2 Brand3 Brand4
#Brand1 100 100.00000 0.00000 60
#Brand2 75 100.00000 0.00000 40
#Brand3 0 0.00000 100.00000 40
#Brand4 75 66.66667 66.66667 100
数据
d = structure(list(Id = 1:7,
Brand1 = c(1L, 0L, 1L, 1L, 0L, 0L, 1L),
Brand2 = c(1L, 0L, 1L, 0L, 0L, 0L, 1L),
Brand3 = c(0L, 1L, 0L, 0L, 1L, 1L, 0L),
Brand4 = c(1L, 1L, 0L, 1L, 1L, 0L, 1L)),
class = "data.frame",
row.names = c(NA, -7L))
答案 1 :(得分:1)
我们可以使用矩阵乘法来做到这一点。使用d.b的数据:
dmat = as.matrix(d[-1])
count = t(dmat) %*% dmat
count
# Brand1 Brand2 Brand3 Brand4
# Brand1 4 3 0 3
# Brand2 3 3 0 2
# Brand3 0 0 3 2
# Brand4 3 2 2 5
apply(count, 2, function(x) x / max(x))
# Brand1 Brand2 Brand3 Brand4
# Brand1 1.00 1.0000000 0.0000000 0.6
# Brand2 0.75 1.0000000 0.0000000 0.4
# Brand3 0.00 0.0000000 1.0000000 0.4
# Brand4 0.75 0.6666667 0.6666667 1.0