1

I have a table like this:

chr  start    end   con1_1_1   con1_2_1   con1_3_1  con2_1_4  con2_2_4  con2_3_4
1    1      1   7512 0.45180723 0.21982759 0.06666667 0.4105960 0.1024735 0.2284710
2    1  13169  20070 0.07142857 0.77631579 0.90434783 0.1363636 0.8985507 0.6033058
3    1  36598  37518 0.13750000 0.43300248 0.09113300 0.9612403 0.1233596 0.7459016
4    1  37512  40365 0.64940239 0.95954693 0.46091644 0.7251656 0.1325648 0.4121901
5    1  40359  48801 0.09504132 0.96491228 0.15428571 0.6388889 0.5165165 0.8050847
6    1  77084  83129 0.91773779 0.28978224 0.56115108 0.9587302 0.5469256 0.6995614

My data are in 2 conditions with 3 replications in each condition. I would like for each row to run a Kruskal-Wallis rank sum test, which means that in each row the con1 (with 3 values) will be tested with con2 (with 3 values). This is what I tried to do but I don't know if it works correctly and if the selection is right.

for (j in 1:len) { 

  data=newdata[len,]
  flabel<-factor(c(rep("con1",3),rep("con2",3)))
  data1=c(data[,4],data[,5],data[,6],data[,7],data[,8],data[,9])
  datav=data.frame(flabel,data1)
  test=kruskal.test(data1 ~ flabel, data = datav)
  print(test$p.value)

}

Do you know any faster or more elegant way to do the test for each row?

OTStats
  • 1,820
  • 1
  • 13
  • 22
user3683485
  • 115
  • 1
  • 8

1 Answers1

1

You can try to create your own function, and apply it to each row. broom::tidy could help:

 library(broom)

 # function that put the second 3 cols vs the third 3 cols of the dats,
 # using the kruskal test
 fun <- function(x) {
   tidy(kruskal.test(list(x[4:6],x[7:9])))
 }

apply(dats, 1, fun)

Using the tidy function, you can also do this:

 # store the result as a list
 test <- apply(dats, 1, fun)

 # "flat" it
 test <- do.call(rbind,test)

cbind(dats,test)

  chr start   end   con1_1_1  con1_2_1   con1_3_1  con2_1_4  con2_2_4  con2_3_4  statistic   p.value parameter
1   1     1  7512 0.45180723 0.2198276 0.06666667 0.4105960 0.1024735 0.2284710 0.04761905 0.8272593         1
2   1 13169 20070 0.07142857 0.7763158 0.90434783 0.1363636 0.8985507 0.6033058 0.04761905 0.8272593         1
3   1 36598 37518 0.13750000 0.4330025 0.09113300 0.9612403 0.1233596 0.7459016 1.19047619 0.2752335         1
4   1 37512 40365 0.64940239 0.9595469 0.46091644 0.7251656 0.1325648 0.4121901 1.19047619 0.2752335         1
5   1 40359 48801 0.09504132 0.9649123 0.15428571 0.6388889 0.5165165 0.8050847 0.42857143 0.5126908         1
6   1 77084 83129 0.91773779 0.2897822 0.56115108 0.9587302 0.5469256 0.6995614 0.42857143 0.5126908         1
                        method
1 Kruskal-Wallis rank sum test
2 Kruskal-Wallis rank sum test
3 Kruskal-Wallis rank sum test
4 Kruskal-Wallis rank sum test
5 Kruskal-Wallis rank sum test
6 Kruskal-Wallis rank sum test

It seems that you have the same results 2 by two:

# first row
x <-c( 0.07142857, 0.7763158, 0.90434783)
y <- c ( 0.1363636, 0.8985507, 0.6033058)
kruskal.test(list(x,y))
    Kruskal-Wallis rank sum test

data:  list(x, y)
Kruskal-Wallis chi-squared = 0.047619, df = 1, p-value = 0.8273

# second row
x <-c( 0.45180723,  0.2198276, 0.06666667)
y <- c (0.4105960, 0.1024735, 0.2284710)
kruskal.test(list(x,y))
    Kruskal-Wallis rank sum test

data:  list(x, y)
Kruskal-Wallis chi-squared = 0.047619, df = 1, p-value = 0.8273

With data:

dats <- read.table(text ="chr  start    end   con1_1_1   con1_2_1   con1_3_1  con2_1_4  con2_2_4  con2_3_4
1    1      1   7512 0.45180723 0.21982759 0.06666667 0.4105960 0.1024735 0.2284710
2    1  13169  20070 0.07142857 0.77631579 0.90434783 0.1363636 0.8985507 0.6033058
3    1  36598  37518 0.13750000 0.43300248 0.09113300 0.9612403 0.1233596 0.7459016
4    1  37512  40365 0.64940239 0.95954693 0.46091644 0.7251656 0.1325648 0.4121901
5    1  40359  48801 0.09504132 0.96491228 0.15428571 0.6388889 0.5165165 0.8050847
6    1  77084  83129 0.91773779 0.28978224 0.56115108 0.9587302 0.5469256 0.6995614", header = T)
s__
  • 9,270
  • 3
  • 27
  • 45
  • We don't want to compare each element of con1 with each element of con2 like above. the test is taking into account the 3 elements of con1 versus 3 elements of con2 . in that case at each line we will have one result of Kruskal-Wallis rank sum test – user3683485 Feb 04 '19 at 15:17
  • In all cases it looks that the result o fkruskal.test is the same 0.3678794 so i think that something is wrong with the calculation between the elements of the 2 groups ! – user3683485 Feb 05 '19 at 14:38