[R] A question on list and lapply

arun smartpink111 at yahoo.com
Fri Dec 14 22:40:20 CET 2012


HI Bill,

bases
#$O
#[1] "Oak Harbor"

#$P
#[1] "Pensicola"
#
#$Q
#[1] "Quonset Point"

res2<- lapply(bases,function(x) {if(names(bases)[match.call()[[2]][[3]]]%in% "P") tolower(x) else paste0("(",x,")")})
res2
#$O
#[1] "(Oak Harbor)"
#
#$P
#[1] "pensicola"
#
#$Q
#[1] "(Quonset Point)"
#the names of the list elements are not lost  here, while in your solution, it is not there and needs to be named again.


res1<-lapply(seq_along(bases),
 function(i){ base <- bases[i] ; if (names(base) != "P") 
paste0("(",base,")") else tolower(base) } )
names(res1)
#NULL
 names(res2)
#[1] "O" "P" "Q"
A.K.



----- Original Message -----
From: William Dunlap <wdunlap at tibco.com>
To: arun <smartpink111 at yahoo.com>; Christofer Bogaso <bogaso.christofer at gmail.com>
Cc: R help <r-help at r-project.org>
Sent: Friday, December 14, 2012 3:59 PM
Subject: RE: [R] A question on list and lapply

> lapply(lapply(Dat,My_Function),function(x) {if(names(Dat)[match.call()[[2]][[3]]]%in%
> "P") NULL else x})

match.call()[[2]][[3]], gack!

In lapply(X, FUN), FUN is applied to X[[i]], which has lost the names attribute that X
may have had.  X[i] retains a part of the names attribute (since it is a sublist of X, not an element
of X).  Hence FUN can look at the name associated with X[i] with code like the following:
     lapply(seq_along(X), FUN=function(i) { Xi <- X[i] ; names(Xi) })

E.g., to apply one sort of processing to elements named "P" and another sort to those
not named "P" you can do:
  > bases <- list(O="Oak Harbor",P="Pensicola",Q="Quonset Point")
  > lapply(seq_along(bases), function(i){ base <- bases[i] ; if (names(base) != "P") paste0("(",base,")") else tolower(base) } )
  [[1]]
  [1] "(Oak Harbor)"  
  
  [[2]]
  [1] "pensicola"
  
  [[3]]
  [1] "(Quonset Point)"

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com


> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
> Of arun
> Sent: Friday, December 14, 2012 12:11 PM
> To: Christofer Bogaso
> Cc: R help
> Subject: Re: [R] A question on list and lapply
> 
> Hi,
> 
> If you want the list element "P" to be present as NULL in the result
> you could use this:
> set.seed(51)
> lapply(lapply(Dat,My_Function),function(x) {if(names(Dat)[match.call()[[2]][[3]]]%in%
> "P") NULL else x})
> A.K.
> 
> 
> 
> 
> ----- Original Message -----
> From: Christofer Bogaso <bogaso.christofer at gmail.com>
> To: r-help at r-project.org
> Cc:
> Sent: Friday, December 14, 2012 1:58 PM
> Subject: [R] A question on list and lapply
> 
> Dear all, let say I have following list:
> 
> Dat <- vector("list", length = 26)
> names(Dat) <- LETTERS
> My_Function <- function(x) return(rnorm(5))
> Dat1 <- lapply(Dat, My_Function)
> 
> 
> However I want to apply my function 'My_Function' for all elements of 'Dat' except the
> elements having 'names(Dat) == "P"'. Here I have specified the name "P" just for
> illustration however this will be some name specified by user.
> 
> Is there any direct way to achieve this, using 'lapply'?
> 
> Thanks for your help.
> 
> ______________________________________________
> 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.
> 
> ______________________________________________
> 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.





More information about the R-help mailing list