Serguei Kaniovski
2006-Sep-22 08:44 UTC
[R] Compiling a contingency table of counts by case
I have asked a similar question before but this time the problem is somewhat more involved. I have the following data: case;name;x 1;Joe;1 1;Mike;1 1;Zoe;1 2;Joe;1 2;Mike;0 2;Zoe;1 2;John;1 3;Mike;1 3;Zoe;0 3;Karl;0 I would like to count the number of "case" in which any two "name" a. both have "x=1", b. the first has "x=0" - the second has "x=1", c. the first has "x=1" - the second has "x=0", d. both have "x=0", The difficulty is that the number of "names" and their identity changes from case to case. Thanks a lot for you help, Serguei Kaniovski -- ___________________________________________________________________ Austrian Institute of Economic Research (WIFO) Name: Serguei Kaniovski P.O.Box 91 Tel.: +43-1-7982601-231 Arsenal Objekt 20 Fax: +43-1-7989386 1103 Vienna, Austria Mail: Serguei.Kaniovski at wifo.ac.at http://www.wifo.ac.at/Serguei.Kaniovski
> dat <- read.delim("clipboard", sep=";")> dat <- dat[order(dat$case, dat$name), ] > res <- apply(combinations(nlevels(dat$name), 2), 1, function(x) with(dat[dat$name %in% levels(dat$name)[x],], table(unlist(sapply(split(x, case), function(y) ifelse(length(y) == 2, paste(y, collapse=""), NA)))))) > names(res) <- apply(combinations(nlevels(dat$name), 2), 1, function(x) paste(levels(dat$name)[x], collapse=".")) > res $Joe.John 11 1 $Joe.Karl character(0) $Joe.Mike 10 11 1 1 $Joe.Zoe 11 2 $John.Karl character(0) $John.Mike 10 1 $John.Zoe 11 1 $Karl.Mike 01 1 $Karl.Zoe 00 1 $Mike.Zoe 01 10 11 1 1 1 ------------------------------------------------------------------- Jacques VESLOT CNRS UMR 8090 I.B.L (2?me ?tage) 1 rue du Professeur Calmette B.P. 245 59019 Lille Cedex Tel : 33 (0)3.20.87.10.44 Fax : 33 (0)3.20.87.10.31 http://www-good.ibl.fr ------------------------------------------------------------------- Serguei Kaniovski a ?crit :> I have asked a similar question before but this time > the problem is somewhat more involved. I have the > following data: > > case;name;x > 1;Joe;1 > 1;Mike;1 > 1;Zoe;1 > 2;Joe;1 > 2;Mike;0 > 2;Zoe;1 > 2;John;1 > 3;Mike;1 > 3;Zoe;0 > 3;Karl;0 > > I would like to count the number of "case" > in which any two "name" > > a. both have "x=1", > b. the first has "x=0" - the second has "x=1", > c. the first has "x=1" - the second has "x=0", > d. both have "x=0", > > The difficulty is that the number of "names" and their > identity changes from case to case. > > Thanks a lot for you help, > Serguei Kaniovski
Serguei Kaniovski
2006-Sep-22 13:04 UTC
[R] Compiling a contingency table of counts by case
Thanks Jacques, this works! Serguei -- ___________________________________________________________________ Austrian Institute of Economic Research (WIFO) Name: Serguei Kaniovski P.O.Box 91 Tel.: +43-1-7982601-231 Arsenal Objekt 20 Fax: +43-1-7989386 1103 Vienna, Austria Mail: Serguei.Kaniovski at wifo.ac.at http://www.wifo.ac.at/Serguei.Kaniovski
> I have asked a similar question before but this time > the problem is somewhat more involved. I have the > following data: > > case;name;x > 1;Joe;1 > 1;Mike;1 > 1;Zoe;1 > 2;Joe;1 > 2;Mike;0 > 2;Zoe;1 > 2;John;1 > 3;Mike;1 > 3;Zoe;0 > 3;Karl;0 > > I would like to count the number of "case" > in which any two "name" > > a. both have "x=1", > b. the first has "x=0" - the second has "x=1", > c. the first has "x=1" - the second has "x=0", > d. both have "x=0",One way is to use the reshape package: dat <- read.delim("clipboard", sep=";") dat <- rename(dat, c(x=value)) cast(dat, name ~ case) (which doesn't give you exactly what you want, but I think might be more illuminating) Hadley