我想知道是否有一种直接的方法可以在3向平面(!)列联表中获得嵌套的相对频率。
N <- 10
(sex <- factor(sample(c("f", "m"), N, replace=TRUE)))
(work <- factor(sample(c("home", "office"), N, replace=TRUE)))
(satisfaction <- factor(sample(c("excellent", "ok","bad"), N, replace=TRUE)))
ftable(work, sex, satisfaction, row.vars=c("sex", "satisfaction"))
此代码生成此输出:
work home office
sex satisfaction
f bad 1 1
excellent 0 1
ok 1 1
m bad 1 0
excellent 1 0
ok 1 2
我想得到的是
work home office
sex satisfaction
f bad 0.2 0.2
excellent 0 0.2
ok 0.2 0.2
m bad 0.2 0
excellent 0.2 0
ok 0.2 0.4
我知道我可以用prop.table计算表格但是还没弄清楚如何将这与ftable产生的平面列联表结合起来。肯定有一种方法可以分别计算每个性别组的相对频率,但我对更直接的方式感兴趣。 到目前为止,我还没有找到任何方法如何将相对频率变为平面列联表。
注意:在这个例子中,男性和女性群体的大小相同(5);但是,我正在寻找的解决方案应该足够灵活,以便群组也可以有不同的大小。
非常感谢!
答案 0 :(得分:3)
也许您可以考虑从table
开始,然后使用prop.table
中包含的ftable
:
y <- table(sex, satisfaction, work)
y
# , , work = home
#
# satisfaction
# sex bad excellent ok
# f 1 1 0
# m 1 1 1
#
# , , work = office
#
# satisfaction
# sex bad excellent ok
# f 0 1 1
# m 0 1 2
ftable(prop.table(y, margin=3))
# work home office
# sex satisfaction
# f bad 0.2 0.0
# excellent 0.2 0.2
# ok 0.0 0.2
# m bad 0.2 0.0
# excellent 0.2 0.2
# ok 0.2 0.4
这假设我们从这样开始:
set.seed(1)
N <- 10
sex <- factor(sample(c("f", "m"), N, replace=TRUE))
work <- factor(sample(c("home", "office"), N, replace=TRUE))
satisfaction <- factor(sample(c("excellent", "ok","bad"), N, replace=TRUE))
同样,如果您已经有ftable
(让我们称之为&#34; x&#34;),您可以尝试:
ftable(prop.table(as.table(x), margin=3))
答案 1 :(得分:0)
我会尝试这样的事情:
require("data.table")
dt <- data.table(sex,work,satisfaction)
dt2 <- dcast.data.table(dt,sex+satisfaction~work,value.var="satisfaction",fun=length)
dt2[,':=' (home=home/sum(home),office=office/sum(office))]
combs <- data.table(expand.grid(sex=levels(sex),satisfaction=levels(satisfaction)))
merge(combs,dt2,by=c("sex","satisfaction"),all.x=T)
# sex satisfaction home office
# 1: f bad 0.50000000 0.5
# 2: f excellent 0.16666667 0.0
# 3: f ok NA NA
# 4: m bad 0.08333333 0.0
# 5: m excellent 0.25000000 0.0
# 6: m ok 0.00000000 0.5