[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