You can use this instead:
within(as.data.frame(t(combn(rownames(ex), 2)), stringsAsFactors=FALSE), {
CvsDp <- mapply(function(i,j)chisq.test(ex[c(i,j),c("C","D")])$p.value,V1,V2)
AvsBp <- mapply(function(i,j)chisq.test(ex[c(i,j),c("A","B")])$p.value,V1,V2)
})
Result
V1 V2 AvsBp CvsDp
1 E F 0.91819969 0.608649273
2 E G 0.43257210 0.790459437
3 E H 0.35865125 0.723319426
4 E I 0.96056413 0.089684835
5 E J 0.01440299 0.002829232
6 F G 0.42498245 0.932706790
7 F H 0.36295550 0.982958067
8 F I 0.96863115 0.068473490
9 F J 0.01958004 0.003022993
10 G H 0.99865918 1.000000000
11 G I 0.35499642 0.102779772
12 G J 0.10703032 0.004604047
13 H I 0.28482657 0.080105009
14 H J 0.12305793 0.003324808
15 I J 0.00951511 0.055983338
EDIT: as a triangular table, given x
= the result above:
m <- matrix(nrow=nrow(ex), ncol=nrow(ex))
rownames(m) <- colnames(m) <- rownames(ex)
m[cbind(x$V1,x$V2)] <- x$AvsBp
Result
E F G H I J
E NA 0.9181997 0.4325721 0.3586512 0.9605641 0.01440299
F NA NA 0.4249824 0.3629555 0.9686312 0.01958004
G NA NA NA 0.9986592 0.3549964 0.10703032
H NA NA NA NA 0.2848266 0.12305793
I NA NA NA NA NA 0.00951511
J NA NA NA NA NA NA
For CvsDp
just replace it in the last line.