我如何得到二元组合的平均值?

时间:2014-08-06 00:59:46

标签: r data.table aggregate

enter image description here

我的数据如上所示。我有9个二进制变量,9个二进制变量可以有27个组合。我想用27种组合得到raltv的总和或平均值 换句话说,我希望获得3个3X3表,并且表的元素是每个组合的平均值(raltv)(或sum(raltv))。
此外,我还想在每个组合中使用频率值。

1 个答案:

答案 0 :(得分:2)

由于列是互斥的,我认为最好将3列的每个组折叠到一个标记为1/2/3或低/中/高的变量,然后使用tapply计算均值每组。 E.g:

dat <- data.frame(raltv=1:6,one_low=c(1,1,0,0,0,0),one_med=c(0,0,1,1,0,0),one_hi =c(0,0,0,0,1,1),two_low=c(1,1,0,0,0,0),two_med=c(0,0,1,1,0,0),two_hi =c(0,0,0,0,1,1),thr_low=c(1,1,0,0,0,0),thr_med=c(0,0,1,1,0,0),thr_hi =c(0,0,0,0,1,1))

看起来像:

  raltv one_low one_med one_hi two_low two_med two_hi thr_low thr_med thr_hi
1     1       1       0      0       1       0      0       1       0      0
2     2       1       0      0       1       0      0       1       0      0
3     3       0       1      0       0       1      0       0       1      0
4     4       0       1      0       0       1      0       0       1      0
5     5       0       0      1       0       0      1       0       0      1
6     6       0       0      1       0       0      1       0       0      1

处理它:

dat$one <- c("low","med","hi")[col(dat[2:4])[dat[2:4]==1]]
dat$two <- c("low","med","hi")[col(dat[5:7])[dat[5:7]==1]]
dat$thr <- c("low","med","hi")[col(dat[8:10])[dat[8:10]==1]]

tapply(dat$raltv,dat[c("one","two","thr")],mean)

#, , thr = hi
# 
#     two
#one    hi low med
#  hi  5.5  NA  NA
#  low  NA  NA  NA
#  med  NA  NA  NA
#  
#, , thr = low
# 
#     two
#one   hi low med
#  hi  NA  NA  NA
#  low NA 1.5  NA
#  med NA  NA  NA
# 
#, , thr = med
# 
#     two
#one   hi low med
#  hi  NA  NA  NA
#  low NA  NA  NA
#  med NA  NA 3.5