You might consider looking first at the means (after putting this data in a dataframe 'datm'):
> aggregate(datm$value, datm['variable'], mean, na.rm=TRUE)
variable x
1 x 0.9566667
2 y 1.4277778
3 z 2.3700000
4 b 0.0787500
Or at medians:
> aggregate(datm$value, datm['variable'], median, na.rm=TRUE)
variable x
1 x 0.750
2 y 1.710
3 z 2.265
4 b 0.010
In package coin there is a post-hoc test that is based on ranks (as kruskal.test is.) It is actually in the examples of the LocationTests help page and is reproduced without modification except for changing the names of the columns in the formula and the dataset name. There is no cited author for that page but the package authors are here: Torsten Hothorn, Kurt Hornik, Mark A. van de Wiel and Achim Zeileis:
### Nemenyi-Damico-Wolfe-Dunn test (joint ranking)
### Hollander & Wolfe (1999), page 244
### (where Steel-Dwass results are given)
if (require("multcomp")) {
NDWD <- oneway_test(value~variable, data = datm,
ytrafo = function(data) trafo(data, numeric_trafo = rank),
xtrafo = function(data) trafo(data, factor_trafo = function(x)
model.matrix(~x - 1) %*% t(contrMat(table(x), "Tukey"))),
teststat = "max", distribution = approximate(B = 90000))
### global p-value
print(pvalue(NDWD))
### DWin note: prints pairwise p-value for comparison of rankings
print(pvalue(NDWD, method = "single-step"))
}
#-----------------------
[1] 0
99 percent confidence interval:
0.000000e+00 5.886846e-05
y - x 0.8287000
z - x 0.1039889
b - x 0.1107667
z - y 0.5421778
b - y 0.0053000
b - z 0.0000000
To answer the question in the comment, this is what I did:
dat <- read.table(text="x y z b
2.06 1.71 2.47 0.00
1.08 2.73 1.75 0.00
1.94 2.29 2.44 0.01
1.32 1.71 2.50 0.01
0.75 2.40 4.17 0.01
0.18 0.45 2.09 0.20
0.72 0.58 1.77 0.30
0.22 0.35 1.77 0.10
0.34 0.63 NA NA", header=TRUE)
require(reshape2)
#Loading required package: reshape2
datm <- melt(dat) # then proceeded as above.