On 22/03/20 4:01 pm, Thomas Subia via R-help wrote:

Colleagues,

Here is my dataset.

Serial  Measurement     Meas_test       Serial_test
1       17              fail            fail
1       16              pass            fail
2       12              pass            pass
2       8               pass            pass
2       10              pass            pass
3       19              fail            fail
3       13              pass            pass

If a measurement is less than or equal to 16, then Meas_test is pass. Else
Meas_test is fail
This is easy to code.

Serial_test is a pass, when all of the Meas_test are pass for a given
serial. Else Serial_test is a fail.
I'm at a loss to figure out how to do this in R.

Some guidance would be appreciated.

In future, please present your data using dput(); makes life much easier for those trying to help you. Your data are really the first two columns of what you presented --- the last two columns are your desired output.

Let "X" be these first two columns.  Define

foo <- function (X) {
a <- with(X,Measurement <= 16)
a <- ifelse(a,"pass","fail")
b <- with(X,tapply(Measurement,Serial,function(x){all(x<=16)}))
i <- match(X$Serial,names(b))
b <- ifelse(b[i],"pass","fail")
data.frame(Meas_test=a,Serial_test=b)
}

foo(X) gives:

  Meas_test Serial_test
1      fail        fail
2      pass        fail
3      pass        pass
4      pass        pass
5      pass        pass
6      fail        fail
7      pass        fail

If you want input and output combined, as in the way that you presented your data use cbind(X,foo(X)).

cheers,

Rolf Turner

--
Honorary Research Fellow
Department of Statistics
University of Auckland
Phone: +64-9-373-7599 ext. 88276

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to