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.