Hi David and Jeff, Thanks for your quick help, unclass() was precisely what I was looking for.
Cheers, M On Mon, Aug 29, 2016 at 10:39 AM, aditya pant <adityapa...@gmail.com> wrote: > > ^^ठश्रएइ),,, > ________________________________ > From: David Winsemius > Sent: 29-08-2016 11:59 > To: Marius Hofert > Cc: R-help > Subject: Re: [R] How to split a data.frame into its columns? > > >> On Aug 28, 2016, at 11:14 PM, Marius Hofert <marius.hof...@uwaterloo.ca> >> wrote: >> >> Hi, >> >> I need a fast way to split a data.frame (and matrix) into a list of >> columns. > > This is a bit of a puzzle since data.frame objects are by definition "lists > of columns". > > If you want a data.frame object (say it's name is dat) to _only be a list of > columns then > > dat <- unclass(dat) > > The split.data.frame function splits by rows since that is the most desired > and expected behavior and because the authors of S/R probably thought there > was no point in making the split "by columns" when it already was. > > -- > David. > >> For matrices, split(x, col(x)) works (which can then be done >> in C for speed-up, if necessary), but for a data.frame? split(iris, >> col(iris)) does not work as expected (?). >> The outcome should be lapply(seq_len(ncol(iris)), function(j) >> iris[,j]) and not require additional packages (if possible). >> >> Thanks & cheers, >> Marius >> >> PS: Below is the C code for matrices. Not sure how easy it would be to >> extend that to data.frames (?) >> >> SEXP col_split(SEXP x) >> { >> /* Setup */ >> int *dims = INTEGER(getAttrib(x, R_DimSymbol)); >> int n = dims[0], d = dims[1]; >> SEXP res = PROTECT(allocVector(VECSXP, d)); >> SEXP ref; >> int i = 0, j, k; >> >> /* Distinguish int/real matrices */ >> switch (TYPEOF(x)) { >> case INTSXP: >> for(j = 0; j < d; j++) { >> SET_VECTOR_ELT(res, j, allocVector(INTSXP, n)); >> int *e = INTEGER(VECTOR_ELT(res, j)); >> for(k = 0 ; k < n ; i++, k++) { >> e[k] = INTEGER(x)[i]; >> } >> } >> break; >> case REALSXP: >> for(j = 0; j < d; j++) { >> SET_VECTOR_ELT(res, j, allocVector(REALSXP, n)); >> double *e = REAL(VECTOR_ELT(res, j)); >> for(k = 0 ; k < n ; i++, k++) { >> e[k] = REAL(x)[i]; >> } >> } >> break; >> case LGLSXP: >> for(j = 0; j < d; j++) { >> SET_VECTOR_ELT(res, j, allocVector(LGLSXP, n)); >> int *e = LOGICAL(VECTOR_ELT(res, j)); >> for(k = 0 ; k < n ; i++, k++) { >> e[k] = LOGICAL(x)[i]; >> } >> } >> break; >> case STRSXP: >> for(j = 0; j < d; j++) { >> ref = allocVector(STRSXP, n); >> SET_VECTOR_ELT(res, j, ref); >> ref = VECTOR_ELT(res, j); >> for(k = 0 ; k < n ; i++, k++) { >> SET_STRING_ELT(ref, k, STRING_ELT(x, i)); >> } >> } >> break; >> default: error("Wrong type of 'x': %s", >> CHAR(type2str_nowarn(TYPEOF(x)))); >> } >> >> /* Return */ >> UNPROTECT(1); >> return(res); >> } >> >> ______________________________________________ >> 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. > > David Winsemius > Alameda, CA, USA > > ______________________________________________ > 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. ______________________________________________ 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.