Hi there, I have a problem about lapply, strsplit, and accessing list elements, which I don't understand or cannot solve: I have e.g. a character vector with three elements: x = c("349/077,349/074,349/100,349/117", "340/384.2,340/513,367/139,455/128,D13/168", "600/437,128/903,128/904") The task I want to perform, is to generate a list, comprising the portion in front of the "/" of each element of x: neededResult = list(c("349","349", "349", "349"), c("340", "340", "367", "455", "D13"), c("600", "128", "128") ) I figured out that for a single element of x the following works unlist( lapply( strsplit( unlist( strsplit(x[1], "\\,") ), "/"), "[", 1) ) but due to "unlist" it doesn't provide the required result if extended to all elements of x unlist(lapply(strsplit( unlist( lapply(x, strsplit, "\\,")), "/"), "[",)) Someone can help me to get the needed result? Thanks and regards, Dirk
> -----Original Message----- > From: r-help-bounces at r-project.org > [mailto:r-help-bounces at r-project.org] On Behalf Of Dick Harray > Sent: Friday, February 04, 2011 7:37 AM > To: r-help at r-project.org > Subject: [R] lapply, strsplit, and list elements > > Hi there, > > I have a problem about lapply, strsplit, and accessing list elements, > which I don't understand or cannot solve: > > I have e.g. a character vector with three elements: > > x = c("349/077,349/074,349/100,349/117", > "340/384.2,340/513,367/139,455/128,D13/168", > "600/437,128/903,128/904") > > > The task I want to perform, is to generate a list, comprising the > portion in front of the "/" of each element of x: > > neededResult = list(c("349","349", "349", "349"), > c("340", "340", "367", "455", "D13"), > c("600", "128", "128") )Try the following, which first splits each string by commas (returning a list), then removes the first slash and everything after it (using lapply to maintain the list structure). > gotResult <- lapply(strsplit(x, ","), function(xi)gsub("/.*", "", xi)) > identical(getResult, neededResult) [1] TRUE Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com> > > I figured out that for a single element of x the following works > > unlist( lapply( strsplit( unlist( strsplit(x[1], "\\,") ), > "/"), "[", 1) ) > > but due to "unlist" it doesn't provide the required result if extended > to all elements of x > > unlist(lapply(strsplit( unlist( lapply(x, strsplit, "\\,")), > "/"), "[",)) > > > Someone can help me to get the needed result? > > Thanks and regards, > > Dirk > > ______________________________________________ > 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. >
Try this:> x <- c("349/077,349/074,349/100,349/117",+ "340/384.2,340/513,367/139,455/128,D13/168", + "600/437,128/903,128/904")> > library(gsubfn) > out <- strapply(x, '([0-9]+)(?=/)') > out[[1]] [1] "349" "349" "349" "349" [[2]] [1] "340" "340" "367" "455" "13" [[3]] [1] "600" "128" "128" The strapply looks for the pattern then returns every time it finds the pattern. The pattern in this case is 1 or more digits that are followed by a /, but the slash is not included in the matched portion (a positive look ahead). If you need more than digits you can modify the pattern to whatever matches before the /. Hope this helps, -- Gregory (Greg) L. Snow Ph.D. Statistical Data Center Intermountain Healthcare greg.snow at imail.org 801.408.8111> -----Original Message----- > From: r-help-bounces at r-project.org [mailto:r-help-bounces at r- > project.org] On Behalf Of Dick Harray > Sent: Friday, February 04, 2011 8:37 AM > To: r-help at r-project.org > Subject: [R] lapply, strsplit, and list elements > > Hi there, > > I have a problem about lapply, strsplit, and accessing list elements, > which I don't understand or cannot solve: > > I have e.g. a character vector with three elements: > > x = c("349/077,349/074,349/100,349/117", > "340/384.2,340/513,367/139,455/128,D13/168", > "600/437,128/903,128/904") > > > The task I want to perform, is to generate a list, comprising the > portion in front of the "/" of each element of x: > > neededResult = list(c("349","349", "349", "349"), > c("340", "340", "367", "455", "D13"), > c("600", "128", "128") ) > > > I figured out that for a single element of x the following works > > unlist( lapply( strsplit( unlist( strsplit(x[1], "\\,") ), "/"), "[", > 1) ) > > but due to "unlist" it doesn't provide the required result if extended > to all elements of x > > unlist(lapply(strsplit( unlist( lapply(x, strsplit, "\\,")), "/"), > "[",)) > > > Someone can help me to get the needed result? > > Thanks and regards, > > Dirk > > ______________________________________________ > 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.
Try this: strsplit(x, "/\\d+\\.\\d+,|/\\d+,|/\\d+") On Fri, Feb 4, 2011 at 1:37 PM, Dick Harray <tomdharray@gmail.com> wrote:> Hi there, > > I have a problem about lapply, strsplit, and accessing list elements, > which I don't understand or cannot solve: > > I have e.g. a character vector with three elements: > > x = c("349/077,349/074,349/100,349/117", > "340/384.2,340/513,367/139,455/128,D13/168", > "600/437,128/903,128/904") > > > The task I want to perform, is to generate a list, comprising the > portion in front of the "/" of each element of x: > > neededResult = list(c("349","349", "349", "349"), > c("340", "340", "367", "455", "D13"), > c("600", "128", "128") ) > > > I figured out that for a single element of x the following works > > unlist( lapply( strsplit( unlist( strsplit(x[1], "\\,") ), "/"), "[", 1) ) > > but due to "unlist" it doesn't provide the required result if extended > to all elements of x > > unlist(lapply(strsplit( unlist( lapply(x, strsplit, "\\,")), "/"), "[",)) > > > Someone can help me to get the needed result? > > Thanks and regards, > > Dirk > > ______________________________________________ > 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. >-- Henrique Dallazuanna Curitiba-Paraná-Brasil 25° 25' 40" S 49° 16' 22" O [[alternative HTML version deleted]]