交叉表 - 需要根据其他列中的某些值聚合多个列
Cross tabs - need to aggregate several columns based on certain values in other columns
我的数据是这样的,所有列都是二进制 presence/absence 数据:
POP1 POP2 POP3 T1 T2 T3 T4 T5 T6 T7 T8 T9
1 1 0 1 1 1 1 0 1 0 0 1
1 0 1 0 1 1 0 1 1 0 1 1
1 1 0 1 1 1 1 0 0 1 0 1
0 0 0 0 1 1 0 1 0 1 1 0
1 0 1 0 0 1 1 1 0 1 1 0
0 1 0 0 1 1 1 0 0 0 0 1
0 1 0 1 1 0 1 0 0 0 0 0
1 1 1 0 1 0 0 0 1 0 0 0
0 0 0 0 1 1 1 1 1 0 0 1
1 0 0 1 0 1 0 1 0 1 1 1
1 1 0 0 1 0 1 0 0 1 0 0
1 0 1 0 1 1 1 0 1 0 1 0
0 1 0 1 1 1 1 0 0 0 0 0
1 0 0 0 1 1 0 0 0 0 1 1
POP1:POP3 是总体,我需要对所有 T1:T9 的所有 POP1=1、POP2=1 和 POP3=1 的所有 1 的计数。我需要一个 table 来交叉制表我的数据,如下所示:
T1 T2 T3 T4 T5 T6 T7 T8 T9
POP1=1 3 9 7 5 3 4 4 5 5
POP2=1 4 7 8 6 2 3 2 0 3
POP3=1 0 3 4 2 2 2 1 3 1
不必费心检查汇总计数,它们不一定正确。我已经尝试了很多 synthaxes 而没有得到我想要的。感谢您的指导。
您需要矩阵乘法%*%
:
t(df[1:3]) %*% as.matrix(df[4:12])
T1 T2 T3 T4 T5 T6 T7 T8 T9
POP1 3 7 7 5 3 4 4 5 5
POP2 4 7 4 6 0 2 2 0 3
POP3 0 3 3 2 2 3 1 3 1
df = structure(list(POP1 = c(1L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 1L,
1L, 1L, 0L, 1L), POP2 = c(1L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 0L,
0L, 1L, 0L, 1L, 0L), POP3 = c(0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L,
0L, 0L, 0L, 1L, 0L, 0L), T1 = c(1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L,
0L, 1L, 0L, 0L, 1L, 0L), T2 = c(1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L,
1L, 0L, 1L, 1L, 1L, 1L), T3 = c(1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L,
1L, 1L, 0L, 1L, 1L, 1L), T4 = c(1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L,
1L, 0L, 1L, 1L, 1L, 0L), T5 = c(0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L,
1L, 1L, 0L, 0L, 0L, 0L), T6 = c(1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L,
1L, 0L, 0L, 1L, 0L, 0L), T7 = c(0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L,
0L, 1L, 1L, 0L, 0L, 0L), T8 = c(0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L,
0L, 1L, 0L, 1L, 0L, 1L), T9 = c(1L, 1L, 1L, 0L, 0L, 1L, 0L, 0L,
1L, 1L, 0L, 0L, 0L, 1L)), .Names = c("POP1", "POP2", "POP3",
"T1", "T2", "T3", "T4", "T5", "T6", "T7", "T8", "T9"), class = "data.frame",
row.names = c(NA, -14L))
library(reshape2)
df = melt(df, id.vars = colnames(df)[-(1:3)] )
do.call(rbind, lapply(split(df, df$variable), function(x)
apply(x[x$value == 1,1:9], 2, function(y) sum(y))))
# T1 T2 T3 T4 T5 T6 T7 T8 T9
#POP1 3 7 7 5 3 4 4 5 5
#POP2 4 7 4 6 0 2 2 0 3
#POP3 0 3 3 2 2 3 1 3 1
我的数据是这样的,所有列都是二进制 presence/absence 数据:
POP1 POP2 POP3 T1 T2 T3 T4 T5 T6 T7 T8 T9
1 1 0 1 1 1 1 0 1 0 0 1
1 0 1 0 1 1 0 1 1 0 1 1
1 1 0 1 1 1 1 0 0 1 0 1
0 0 0 0 1 1 0 1 0 1 1 0
1 0 1 0 0 1 1 1 0 1 1 0
0 1 0 0 1 1 1 0 0 0 0 1
0 1 0 1 1 0 1 0 0 0 0 0
1 1 1 0 1 0 0 0 1 0 0 0
0 0 0 0 1 1 1 1 1 0 0 1
1 0 0 1 0 1 0 1 0 1 1 1
1 1 0 0 1 0 1 0 0 1 0 0
1 0 1 0 1 1 1 0 1 0 1 0
0 1 0 1 1 1 1 0 0 0 0 0
1 0 0 0 1 1 0 0 0 0 1 1
POP1:POP3 是总体,我需要对所有 T1:T9 的所有 POP1=1、POP2=1 和 POP3=1 的所有 1 的计数。我需要一个 table 来交叉制表我的数据,如下所示:
T1 T2 T3 T4 T5 T6 T7 T8 T9
POP1=1 3 9 7 5 3 4 4 5 5
POP2=1 4 7 8 6 2 3 2 0 3
POP3=1 0 3 4 2 2 2 1 3 1
不必费心检查汇总计数,它们不一定正确。我已经尝试了很多 synthaxes 而没有得到我想要的。感谢您的指导。
您需要矩阵乘法%*%
:
t(df[1:3]) %*% as.matrix(df[4:12])
T1 T2 T3 T4 T5 T6 T7 T8 T9
POP1 3 7 7 5 3 4 4 5 5
POP2 4 7 4 6 0 2 2 0 3
POP3 0 3 3 2 2 3 1 3 1
df = structure(list(POP1 = c(1L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 1L,
1L, 1L, 0L, 1L), POP2 = c(1L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 0L,
0L, 1L, 0L, 1L, 0L), POP3 = c(0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L,
0L, 0L, 0L, 1L, 0L, 0L), T1 = c(1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L,
0L, 1L, 0L, 0L, 1L, 0L), T2 = c(1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L,
1L, 0L, 1L, 1L, 1L, 1L), T3 = c(1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L,
1L, 1L, 0L, 1L, 1L, 1L), T4 = c(1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L,
1L, 0L, 1L, 1L, 1L, 0L), T5 = c(0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L,
1L, 1L, 0L, 0L, 0L, 0L), T6 = c(1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L,
1L, 0L, 0L, 1L, 0L, 0L), T7 = c(0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L,
0L, 1L, 1L, 0L, 0L, 0L), T8 = c(0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L,
0L, 1L, 0L, 1L, 0L, 1L), T9 = c(1L, 1L, 1L, 0L, 0L, 1L, 0L, 0L,
1L, 1L, 0L, 0L, 0L, 1L)), .Names = c("POP1", "POP2", "POP3",
"T1", "T2", "T3", "T4", "T5", "T6", "T7", "T8", "T9"), class = "data.frame",
row.names = c(NA, -14L))
library(reshape2)
df = melt(df, id.vars = colnames(df)[-(1:3)] )
do.call(rbind, lapply(split(df, df$variable), function(x)
apply(x[x$value == 1,1:9], 2, function(y) sum(y))))
# T1 T2 T3 T4 T5 T6 T7 T8 T9
#POP1 3 7 7 5 3 4 4 5 5
#POP2 4 7 4 6 0 2 2 0 3
#POP3 0 3 3 2 2 3 1 3 1