计算多个变量的行和列百分比

时间:2014-02-26 15:45:07

标签: r

我有以下数据框

testA   testB   testD   gen
Y   hi  a   M
N   lo  b   F
P   mi  c   M
Y   no  d   F
N   hi  e   M
P   lo  f   F
Y   mi  a   M
N   no  b   F
P   hi  c   M
Y   lo  d   F
N   mi  e   M
P   no  f   F

我想要几个变量代理的百分比。例如,我想要testA与gen和testB V gen。我想为许多变量完成(简化)

    row     column              
N 0.3333333     0.5 
Y 0.3333333     0.5     
P 0.3333333     0.5     
hi 0.5          1
mi 0.5          1
lo 0.0          0
no 0.0          0

手工表格的一部分(testA v gen)我有这个

out.taba=table(test$testA,test$gen)
  cpa=as.data.frame(prop.table(out.tab, 2)[,2]) 
  rpa=as.data.frame(prop.table(out.tab, 1)[,2])

这导致所需表格的上半部分,但输出(变量的响应)按字母顺序排列,按N,P,Y排序,而我希望输出为NYP,下半部分为hi ,mi,lo,no而不是hi,lo,mi,no。

问:如何在不使用手动选项的情况下实现表格,包括响应的优先顺序?

我箍有人可以帮忙!

1 个答案:

答案 0 :(得分:1)

也许是这样的?

df$testA <- factor(df$testA, levels = c("N","Y","P"))
df$testB <- factor(df$testB, levels = c("hi", "mi", "lo", "no"))

l <- lapply(df[ , 1:3], function(x){
  tab <- table(x, df$gen)
  rows <- prop.table(tab, 2)[ , 2]
  cols <- prop.table(tab, 1)[ , 2]
  cbind(rows, cols)
  })

df2 <- do.call(rbind, l)
df2

#         rows cols
# N  0.3333333  0.5
# Y  0.3333333  0.5
# P  0.3333333  0.5
# hi 0.5000000  1.0
# mi 0.5000000  1.0
# lo 0.0000000  0.0
# no 0.0000000  0.0
# a  0.3333333  1.0
# b  0.0000000  0.0
# c  0.3333333  1.0
# d  0.0000000  0.0
# e  0.3333333  1.0
# f  0.0000000  0.0