Cuando queremos aplicar el test de Friedman de medidas repetidas a una variable numérica separada en más de 2 muestras/categorías, necesitamos que los datos estén dispuestos en un objeto matrix y que cada columna sea una de las muestras/categorías:

ctrl trt1 trt2
4.17 4.81 6.31
5.58 4.17 5.12
5.18 4.41 5.54
6.11 3.59 5.50

Pero puede ocurrir que nuestros datos estén apilados en un data.frame, es decir, la variable numérica está en una columna y la variable categórica en otra:

weight group
4.17 ctrl
4.81 trt1
6.31 trt2
5.58 ctrl
4.17 trt1
5.12 trt2
5.18 ctrl
4.41 trt1
5.54 trt2

En este caso, para poder usar la función de R friedman.test() tenemos que desapilar las observaciones con el comando unstack() que separa los valores numéricos en tantas columnas como categorías tiene el factor. Hay que tener en cuenta que cada categoría debe tener el mismo número de observaciones para que las columnas resultantes tengan el mismo número de filas y el objeto sea tipo matrix.


Ejemplo: Con el conjunto de datos PlantGrowth incluido en R no podemos aplicar a la variable weight (peso seco de las plantas) el test de Friedman entre los 3 tratamientos groups a los que se han sometido dichas plantas ctrl,trt1,trt2, ya que las observaciones están en formato dataframe y el uso de la fórmula weight ~ group da error en el test.

# Cargamos los datos
datos <- PlantGrowth
head(datos)
  weight group
1   4.17  ctrl
2   5.58  ctrl
3   5.18  ctrl
4   6.11  ctrl
5   4.50  ctrl
6   4.61  ctrl
# Hacemos el test con ~ y da error
friedman.test(weight ~ group, data = datos)
Error in friedman.test.formula(weight ~ group, data = datos): incorrect specification for 'formula'

Así que, previamente, convertimos el dataframe en una matriz, usando unstack() mediante una fórmula numeric ~ factor que significa que la variable numérica se desapila por las categorías del factor. Una vez desapilada se convierte en matriz con as.matrix():

# Desapilamos los datos
datos.unstack <- unstack(datos, weight ~ group)
# El test no da error
friedman.test(as.matrix(datos.unstack))

    Friedman rank sum test

data:  as.matrix(datos.unstack)
Friedman chi-squared = 4.2, df = 2, p-value = 0.1225