COnsider the following: Age<-c(48, 57, 56, 76, 76, 66, 70, 14, 7, 3, 62, 62, 30, 10, 7, 53, 44, 29, 46, 47, 15, 13, 84, 77, 26) SerialNo<-c(001147, 005979, 005979, 006128, 006128, 007004, 007004, 007004, 007004, 007004, 007438, 007438,009402,009402, 009402, 012693, 012693, 012693, 014063,014063, 014063, 014063, 014811, 014811,016570) TestSet<-cbind(Age,SerialNo) TestSet<-data.frame(TestSet) I am looking to create a third column titled "IsHead". This column would be either TRUE or FALSE depending on whether the Age variable was the greatest for that set of SerialNo's. So for the above i would return: Age SerialNo IsHead 48 1147 TRUE 57 5979 TRUE 56 5979 FALSE 76 6128 TRUE 76 6128 FALSE 66 7004 FALSE 70 7004 TRUE 14 7004 FALSE 7 7004 FALSE 3 7004 FALSE I am thinking this is simple but cannot get my own code to work. Thanks for any insights. JR -- View this message in context: http://www.nabble.com/Truncating-based-on-attribute-range-and-serial-no-tp24796313p24796313.html Sent from the R help mailing list archive at Nabble.com.
On Aug 3, 2009, at 2:04 PM, PDXRugger wrote:> > COnsider the following: > > Age<-c(48, 57, 56, 76, 76, 66, 70, 14, 7, 3, 62, 62, 30, 10, 7, > 53, 44, > 29, 46, 47, 15, 13, 84, 77, 26) > > SerialNo<-c(001147, 005979, 005979, 006128, 006128, 007004, 007004, > 007004, > 007004, 007004, 007438, 007438,009402,009402, 009402, 012693, 012693, > 012693, 014063,014063, 014063, 014063, 014811, 014811,016570) > > TestSet<-cbind(Age,SerialNo) > > TestSet<-data.frame(TestSet) > > I am looking to create a third column titled "IsHead". This column > would be > either TRUE or FALSE depending on whether the Age variable was the > greatest > for that set of SerialNo's. So for the above i would return: > > Age SerialNo IsHead > 48 1147 TRUE > 57 5979 TRUE > 56 5979 FALSE > 76 6128 TRUE > 76 6128 FALSE <--- TRUE for both 76? > 66 7004 FALSE > 70 7004 TRUE > 14 7004 FALSE > 7 7004 FALSE > 3 7004 FALSE > > I am thinking this is simple but cannot get my own code to work. > Thanks for > any insights.Try this: > TestSet Age SerialNo 1 48 1147 2 57 5979 3 56 5979 4 76 6128 5 76 6128 6 66 7004 7 70 7004 8 14 7004 9 7 7004 10 3 7004 11 62 7438 12 62 7438 13 30 9402 14 10 9402 15 7 9402 16 53 12693 17 44 12693 18 29 12693 19 46 14063 20 47 14063 21 15 14063 22 13 14063 23 84 14811 24 77 14811 25 26 16570 # See ?ave for more information # As implemented, this will work for integer values of Age TestSet$IsHead <- as.logical(ave(TestSet$Age, TestSet$SerialNo, FUN = function(x) x == max(x))) > TestSet Age SerialNo IsHead 1 48 1147 TRUE 2 57 5979 TRUE 3 56 5979 FALSE 4 76 6128 TRUE 5 76 6128 TRUE 6 66 7004 FALSE 7 70 7004 TRUE 8 14 7004 FALSE 9 7 7004 FALSE 10 3 7004 FALSE 11 62 7438 TRUE 12 62 7438 TRUE 13 30 9402 TRUE 14 10 9402 FALSE 15 7 9402 FALSE 16 53 12693 TRUE 17 44 12693 FALSE 18 29 12693 FALSE 19 46 14063 FALSE 20 47 14063 TRUE 21 15 14063 FALSE 22 13 14063 FALSE 23 84 14811 TRUE 24 77 14811 FALSE 25 26 16570 TRUE HTH, Marc Schwartz
Jorge Ivan Velez
2009-Aug-03 22:34 UTC
[R] Truncating based on attribute range and serial no
Hi JR, There are few ways to do what you asked for, so here is one suggestion using tapply: Age <- c(48, 57, 56, 76, 76, 66, 70, 14, 7, 3, 62, 62, 30, 10, 7, 53, 44, 29, 46, 47, 15, 13, 84, 77, 26) SerialNo <- c(001147, 005979, 005979, 006128, 006128, 007004, 007004, 007004, 007004, 007004, 007438, 007438,009402,009402, 009402, 012693, 012693, 012693, 014063,014063, 014063, 014063, 014811, 014811,016570) TestSet <- data.frame(Age,SerialNo) TestSet$IsHead <- do.call(c, tapply(Age, SerialNo, function(x) x >= max(x) ) ) TestSet See ?tapply, ?do.call as well as ?ave for more information. HTH, Jorge On Mon, Aug 3, 2009 at 3:04 PM, PDXRugger <> wrote:> > COnsider the following: > > Age<-c(48, 57, 56, 76, 76, 66, 70, 14, 7, 3, 62, 62, 30, 10, 7, 53, 44, > 29, 46, 47, 15, 13, 84, 77, 26) > > SerialNo<-c(001147, 005979, 005979, 006128, 006128, 007004, 007004, 007004, > 007004, 007004, 007438, 007438,009402,009402, 009402, 012693, 012693, > 012693, 014063,014063, 014063, 014063, 014811, 014811,016570) > > TestSet<-cbind(Age,SerialNo) > > TestSet<-data.frame(TestSet) > > I am looking to create a third column titled "IsHead". This column would > be > either TRUE or FALSE depending on whether the Age variable was the greatest > for that set of SerialNo's. So for the above i would return: > > Age SerialNo IsHead > 48 1147 TRUE > 57 5979 TRUE > 56 5979 FALSE > 76 6128 TRUE > 76 6128 FALSE > 66 7004 FALSE > 70 7004 TRUE > 14 7004 FALSE > 7 7004 FALSE > 3 7004 FALSE > > I am thinking this is simple but cannot get my own code to work. Thanks > for > any insights. > > JR > -- > View this message in context: > http://www.nabble.com/Truncating-based-on-attribute-range-and-serial-no-tp24796313p24796313.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help@r-project.org mailing list > 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. >[[alternative HTML version deleted]]