Tenho um data frame que contém medições para vários grupos. Quero aplicar outer
a cada par de grupos e calcular um resumo. Isso pode ser feito no estilo Tidyverse? Abaixo está um exemplo de como fazer isso com dois loops. Eu brinquei com expand_grid
e group_by
, mas sem sucesso.
df <- iris
groups = as.character(levels(df$Species))
n <- length(groups)
out <- matrix(numeric(n*n), nrow = n, ncol = n)
colnames(out) <- groups
rownames(out) <- groups
for (sp1 in 1:n) {
for (sp2 in 1:n) {
out[sp1, sp2] <- sum(outer(
unlist(subset(df, Species == groups[sp1], Sepal.Length)),
unlist(subset(df, Species == groups[sp2], Sepal.Length)),
">"))
}
}
out
setosa versicolor virginica
setosa 1128 139 34
versicolor 2302 1169 479
virginica 2457 1927 1165
1) Base R Com esses tipos de cálculos, a base R é provavelmente mais apropriada. Podemos dividir
Sepal.Length
em uma lista de 3 elementoss
, um componente por Espécie e, então, usarouter
ou um doublesapply
.2) magrittr Poderíamos transformar isso em um pipeline magrittr assim:
3) tidyverse ou ir totalmente tidyverse