1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| DF <- read.table(text = " Color Cat
A 1
B 1
C 4,2
D 1,3
E 1,2
F 3
G 5
A 2
B 3
C 1,2
D 4,3
E 3
F 1
G 1" , header = TRUE)
tblDF <- table(DF$Cat,DF$Color)
cats <- strsplit(rownames(tblDF), ",", fixed = TRUE)
donnéesCat <- as.data.frame(
tblDF[rep(seq_len(nrow(tblDF)), lengths(cats)),],
row.names = seq_len(nrow(tblDF))
)
donnéesCat$cat <- rep(sapply(cats, paste, collapse = ","), lengths(cats))
modalités <- levels(factor(donnéesCat$cat))
sélécteur <- donnéesCat$cat %in% modalités[nchar(modalités) == 1L]
monoCat <- donnéesCat[sélécteur,]
tmpMultiCat <- donnéesCat[!sélécteur,]
traiterMultiCat <- function(contVal, contCat) {
cpt <- dim(contVal)
tmpEnv <- new.env(parent = emptyenv())
tmpEnv$obj <- matrix(NA_real_, nrow = 2 * cpt[1L], ncol = cpt[2L])
tmpEnv$cptObs <- 0
tmpEnv$marqueur <- character(2 * cpt[1L])
for (i in seq_len(cpt[1L])) {
tmp <- unlist(contVal[i, ]) / length(contCat[i, ])
sapply(contCat[i, ], function(x) {
tmpEnv$cptObs <- tmpEnv$cptObs + 1L
tmpEnv$obj[tmpEnv$cptObs, ] <- tmp
tmpEnv$marqueur[tmpEnv$cptObs] <- x
})
}
res <- as.data.frame(tmpEnv$obj)
res$cat <- tmpEnv$marqueur
colnames(res) <- colnames(tmpMultiCat)
return(res)
}
multiCat <- aggregate(
. ~ cat,
traiterMultiCat(
tmpMultiCat[, -8L],
t(as.data.frame(lapply(tmpMultiCat$cat, strsplit, split = ",", fixed = TRUE)))
),
FUN = sum
)[, colnames(monoCat)]
aggregate(. ~ cat, rbind(monoCat, multiCat), FUN = sum) |
Partager