rdataframepairwise.wilcox.test

wilcox test inside rows


I have a data frame:

structure(list(groups = c("A", "A", "A", "A", "B", "B", "B", 
"B", "C", "C", "C", "C", "D", "D", "D", "D"), weight = c(50.34869444, 
49.20443342, 50.62727386, 50.12316397, 49.84571613, 50.88337532, 
48.23188285, 51.13725686, 51.19946209, 49.02212935, 50.00188434, 
49.70067628, 50.50444172, 48.88528478, 49.2378029, 49.11125589
), height = c(149.5389985, 150.7241218, 149.6922257, 149.6660622, 
150.2770344, 149.6382699, 150.1900336, 151.264749, 151.3418096, 
149.9407582, 150.2397936, 149.3163071, 148.079746, 149.1675788, 
147.5201934, 150.8203477), age = c(10.18377395, 8.388813147, 
9.858806212, 9.859746016, 9.584814407, 9.081315423, 10.67367302, 
10.26713746, 10.96606861, 11.58603799, 10.34936347, 9.93621052, 
9.584046986, 8.413787028, 10.39826156, 9.977231496), month_birth = c(3.627272074, 
1.989467718, 2.175805989, 1.095100584, 2.16437856, 1.215151355, 
2.63897628, 0.942159155, 1.155299136, 0.404000756, 1.695590789, 
2.739378326, 1.950649717, 1.312775225, 1.904828579, 1.325257624
)), class = "data.frame", row.names = c(NA, -16L))

I want to use wilcox test to compare columns within each group individually

What was I trying to do:

wilcox.fun <- function(dat, col,group.labels) { 
  
  c1 <- combn(unique(group.labels),2)
  
  sigs <- list()
  for(i in 1:ncol(c1)) {
    sigs[[i]] <- wilcox.test(
      dat[c1[i,],col],
      dat[c1[i,],col]
    )
  }
  names(sigs) <- paste("Group",c1[1,],"by Group",c1[2,])
  
  tests <- data.frame(Test=names(sigs),
                      W=unlist(lapply(sigs,function(x) x$statistic)),
                      p=unlist(lapply(sigs,function(x) x$p.value)),row.names=NULL)
  
  return(tests)
  
}
debug(test.fun)
tests <- lapply(colnames(data[,c(2:6)]),function(x) wilcox.fun(data,group.labels=c(2:6),x))
names(tests) <- colnames(data[,c(2:6)])

I want to use the wilcox test to compare not between groups, but within the same group between the selected columns.


Solution

  • You can try this code to apply wilcox.test for every combination of variables within each group.

    wilcox.fun <- function(dat) { 
      do.call(rbind, combn(names(dat)[-1], 2, function(x) {
        test <- wilcox.test(dat[[x[1]]], dat[[x[2]]])
        data.frame(Test = sprintf('Group %s by Group %s', x[1], x[2]), 
                   W = test$statistic, 
                   p = test$p.value)
      }, simplify = FALSE))
    }
    
    
    result <- purrr::map_df(split(data, data$groups), wilcox.fun, .id = 'Group')