Like this? > l <- replicate(3,data.frame(w1=sample(1:4),w2=sample(1:4)), simplify=FALSE) > l [[1]] w1 w2 1 2 2 2 3 3 3 1 1 4 4 4
[[2]] w1 w2 1 3 4 2 2 2 3 1 3 4 4 1 [[3]] w1 w2 1 1 4 2 4 3 3 2 1 4 3 2 > sapply(l,"[[",2) [,1] [,2] [,3] [1,] 2 4 4 [2,] 3 2 3 [3,] 1 3 1 [4,] 4 1 2 Or even > sapply(l,"[",,2) [,1] [,2] [,3] [1,] 2 4 4 [2,] 3 2 3 [3,] 1 3 1 [4,] 4 1 2 Notice that if dd[1:24] gives you the 1st column, then dd is not a data frame but rather a matrix, and indexing semantics are different. In that case, for some unspeakable reason, the empty index does not work and you'll need something like > l <- replicate(3,cbind(w1=sample(1:4),w2=sample(1:4)), simplify=FALSE) > sapply(l,"[",T,2) [,1] [,2] [,3] [1,] 4 3 2 [2,] 1 1 4 [3,] 3 2 3 [4,] 2 4 1 Or, brute-force-and-ignorance: > sapply(l, function(e) e[, 2]) [,1] [,2] [,3] [1,] 4 3 2 [2,] 1 1 4 [3,] 3 2 3 [4,] 2 4 1 On 09 Feb 2016, at 10:03 , Wolfgang Waser <wa...@frankenfoerder-fg.de> wrote: > Hi, > > sorry if my description was too short / unclear. > >> I have a list of 7 data frames, each data frame having 24 rows (hour of >> the day) and 5 columns (weeks) with a total of 5 x 24 values > > [1] > week1 week2 week3 ... > 1 x a m ... > 2 y b n > 3 z c o > . . . . > . . . . > . . . . > 24 . . . > > > [2] > week1 week2 week3 ... > 1 x2 a2 m2 ... > 2 y2 b2 n2 > 3 z2 c2 o2 > . . . . > . . . . > . . . . > 24 . . . > > > [3] > ... > > . > . > . > > > [7] > ... > > > > I now would like to extract e.g. all week2 columns of all data frames in > the list and combine them in a new data frame using cbind. > > new data frame > > week2 ([1]) week2 ([2]) week2 ([3]) ... > a a2 . > b b2 . > c c2 . > . > . > . > > I will then do further row-wise calculations using e.g. apply(x,1,mean), > the result being a vector of 24 values. > > > I have not found a way to extract specific columns of the data frames in > a list. > > > As mentioned I can use > > sapply(list_of_dataframes,"[",1:24) > > which will pick the first 24 values (first column) of each data frame in > the list and arrange them as an array of 24 rows and 7 columns (7 data > frames are in the list). > To pick the second column (week2) using sapply I have to use the next 24 > values from 25 to 48: > > sapply(list_of_dataframes,"[",25:48) > > > It seems that sapply treats the data frames in the list as vectors. I > can of course extract all consecutive weeks using consecutive blocks of > 24 values, but this seems cumbersome. > > > The question remains, how to select specific columns from data frames in > a list, e.g. all columns 3 of all data frames in the list. > > > Reformatting (unlist(), dim()) in one data frame with one column for > each week does not help, since I'm not calculating colMeans etc, but > row-wise calculations using apply(x,1,FUN) ("applying a function to > margins of an array or matrix"). > > > > Thanks for you help and suggestions! > > > Wolfgang > > > > On 08/02/16 18:00, Dénes Tóth wrote: >> Hi, >> >> Although you did not provide any reproducible example, it seems you >> store the same type of values in your data.frames. If this is true, it >> is much more efficient to store your data in an array: >> >> mylist <- list(a = data.frame(week1 = rnorm(24), week2 = rnorm(24)), >> b = data.frame(week1 = rnorm(24), week2 = rnorm(24))) >> >> myarray <- unlist(mylist, use.names = FALSE) >> dim(myarray) <- c(nrow(mylist$a), ncol(mylist$a), length(mylist)) >> dimnames(myarray) <- list(hour = rownames(mylist$a), >> week = colnames(mylist$a), >> other = names(mylist)) >> # now you can do: >> mean(myarray[, "week1", "a"]) >> >> # or: >> colMeans(myarray) >> >> >> Cheers, >> Denes >> >> >> On 02/08/2016 02:33 PM, Wolfgang Waser wrote: >>> Hello, >>> >>> I have a list of 7 data frames, each data frame having 24 rows (hour of >>> the day) and 5 columns (weeks) with a total of 5 x 24 values >>> >>> I would like to combine all 7 columns of week 1 (and 2 ...) in a >>> separate data frame for hourly calculations, e.g. >>>> apply(new.data.frame,1,mean) >>> >>> In some way sapply (lapply) works, but I cannot directly select columns >>> of the original data frames in the list. As a workaround I have to >>> select a range of values: >>> >>>> sapply(list_of_dataframes,"[",1:24) >>> >>> Values 1:24 give the first column, 25:48 the second and so on. >>> >>> Is there an easier / more direct way to select for specific columns >>> instead of selecting a range of values, avoiding loops? >>> >>> >>> Cheers, >>> >>> Wolfgang >>> >>> ______________________________________________ >>> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see >>> 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. >>> >> > > -- > Frankenförder Forschungsgesellschaft mbH > Dr. Wolfgang Waser > Wissenschaftsbereich Berlin > Chausseestraße 10 > 10115 Berlin > Tel.: +49(0)30 2809 1936 > Fax.: +49(0)30 2809 1940 > E-Mail: wa...@frankenfoerder-fg.de > > Frankenförder Forschungsgesellschaft mbH (FFG) > Sitz: Luckenwalde,Amtsgericht Potsdam, HRB: 6499 > Geschäftsführerin: Dipl. Agraring. Doreen Sparborth > Tel.: +49(0)30 2809 1931, E-Mail: i...@frankenfoerder-fg.de > http://www.frankenfoerder-fg.de > > ______________________________________________ > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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. -- Peter Dalgaard, Professor, Center for Statistics, Copenhagen Business School Solbjerg Plads 3, 2000 Frederiksberg, Denmark Phone: (+45)38153501 Office: A 4.23 Email: pd....@cbs.dk Priv: pda...@gmail.com ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.