Metronome123 wrote on 09/27/2011 07:24:50 AM:>
> Startsituation:
>
> structure(c(1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1,
> 0, 1, 1), .Dim = 4:5, .Dimnames = structure(list(subject =
c("s1",
> "s2", "s3", "s4"), class = c("c1",
"c2", "c3", "c4", "c5")), .Names >
c("subject",
> "class")), class = c("xtabs", "table"), call
= xtabs(formula = ~subject
+ > class, data = ia))
>
> I want a count of subjects that match the same classes in subject_cnt
and a> count of the number of classes in class_cnt The result of this example
> should be:
>
> structure(list(subject_cnt = c(2L, 1L, 1L), class_cnt = c(3L,
> 2L, 3L), c1 = c(1L, 1L, 0L), c2 = c(0L, 1L, 0L), c3 = c(1L, 0L,
> 1L), c4 = c(0L, 0L, 1L), c5 = c(1L, 0L, 1L)), .Names =
c("subject_cnt",
> "class_cnt", "c1", "c2", "c3",
"c4", "c5"), class = "data.frame",
row.names> = c(NA,
> -3L))
>
> How can I achieve this in R, without complicated loops?
>
> PS. Note that the number of classes and subjects are in real quite big.
>
> Cheers,
>
>
> Lars
Try this:
xt <- structure(c(1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1,
1),
.Dim = 4:5,
.Dimnames = structure(list(subject = c("s1", "s2",
"s3", "s4"),
class = c("c1", "c2", "c3",
"c4", "c5")),
.Names = c("subject", "class")),
class = c("xtabs", "table"))
df <- as.data.frame(unclass(xt))
dfu <- unique(df)
class_cnt <- apply(dfu, 1, sum)
subject_cnt <- tabulate(match(apply(df, 1, paste, collapse="-"),
apply(dfu, 1, paste, collapse="-")))
data.frame(subject_cnt, class_cnt, dfu)
Jean
[[alternative HTML version deleted]]