Hi, I have a very simple problem but I can't think how to solve it without using a for loop and creating a large logical vector. However given the nature of the problem I am sure there is a "1-liner" that could do the same thing much more efficiently. bascially I have a dataframe with characters in, eg >names.and.numbers (index) Name Fave.Number 1 John 7 2 Tony 12 3 Phil 14 4 Adam 22 5 Robert 23 Now, imagine I have a vector of names, ie: >names = c("John,Phil,Robert") All I want to do is get the subset of the dataframe which corresponds to the names in the vector "Names". IE (index) Name Fave.Number 1 John 7 2 Phil 14 3 Robert 23 Sorry, I know its trivial but I'm new to R and its hard to start thinking in R, as I say, I've written a complicated for loop using intersect and creating a logical table, but this is very long winded!!! Regards, Jim
On 6/13/2008 10:07 AM, james perkins wrote:> Hi, > > I have a very simple problem but I can't think how to solve it without > using a for loop and creating a large logical vector. However given the > nature of the problem I am sure there is a "1-liner" that could do the > same thing much more efficiently. > > bascially I have a dataframe with characters in, eg > > >names.and.numbers > > (index) Name Fave.Number > 1 John 7 > 2 Tony 12 > 3 Phil 14 > 4 Adam 22 > 5 Robert 23 > > > Now, imagine I have a vector of names, ie: > > >names = c("John,Phil,Robert") > > All I want to do is get the subset of the dataframe which corresponds to > the names in the vector "Names". IE > > (index) Name Fave.Number > 1 John 7 > 2 Phil 14 > 3 Robert 23 > > Sorry, I know its trivial but I'm new to R and its hard to start > thinking in R, as I say, I've written a complicated for loop using > intersect and creating a logical table, but this is very long winded!!!How about this: subset(names.and.numbers, Name %in% mynames) where mynames is the vector of names you want? ?subset ?is.element> Regards, > > Jim > > ______________________________________________ > R-help at 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.-- Chuck Cleland, Ph.D. NDRI, Inc. (www.ndri.org) 71 West 23rd Street, 8th floor New York, NY 10010 tel: (212) 845-4495 (Tu, Th) tel: (732) 512-0171 (M, W, F) fax: (917) 438-0894
james perkins wrote:> Hi, > > I have a very simple problem but I can't think how to solve it without > using a for loop and creating a large logical vector. However given > the nature of the problem I am sure there is a "1-liner" that could do > the same thing much more efficiently. > > bascially I have a dataframe with characters in, eg > > >names.and.numbers > > (index) Name Fave.Number > 1 John 7 > 2 Tony 12 > 3 Phil 14 > 4 Adam 22 > 5 Robert 23 > > > Now, imagine I have a vector of names, ie: > > >names = c("John,Phil,Robert")this is a one-element vector of string(s) that are concatenated names (strings with names). or you mean: names = c("John", "Phil", "Robert")> > All I want to do is get the subset of the dataframe which corresponds > to the names in the vector "Names". IE > > (index) Name Fave.Number > 1 John 7 > 2 Phil 14 > 3 Robert 23this should do: names.and.numbers[names.and.numbers$Name %in% names,] if names is as you say above, do names.and.numbers[names.and.numbers$Name %in% strsplit(names,","), ] you do create a logical vector here (what does 'large' mean?), but no loop is involved at the surface. vQ