Rolf Turner
2019-Oct-20 00:19 UTC
[R] Retaining attributes of columns of a data frame when subsetting.
I am writing a function that involves a data frame "X" some columns of which have attributes. I replace X by a data frame with a subset of the rows of X: X <- X[ok,] where "ok" is a logical vector. When I do this the attributes of the columns (which I need to retain) are lost (except for the "class" and "levels" attributes of columns which are factors). Is there any sexy way to retain the attributes of the columns? So far the only approach that I can work out is to extract the attributes prior to subsetting and put them back after subsetting. Like unto: SaveAt <- lapply(X,attributes) X <- X[ok,] lX <- lapply(names(X),function(nm,x,Sat){ attributes(x[[nm]]) <- Sat[[nm]] x[[nm]]},x=X,Sat=SaveAt) names(lX) <- names(X) X <- as.data.frame(lX) This seems to work, but is rather kludgy. Is there a better way? Thanks for any pointers. cheers, Rolf Turner -- Honorary Research Fellow Department of Statistics University of Auckland Phone: +64-9-373-7599 ext. 88276
Richard M. Heiberger
2019-Oct-20 02:00 UTC
[R] Retaining attributes of columns of a data frame when subsetting.
Look at methods(as.data.frame) Define your specialized columns to have a newly defined class, say "myclass". Then write as.data.frame.myclass It will be similar to the function you already have in the lapply statement. Now your statement X <- X[ok,] should work. Rich On Sat, Oct 19, 2019 at 8:20 PM Rolf Turner <r.turner at auckland.ac.nz> wrote:> > > I am writing a function that involves a data frame "X" some columns of > which have attributes. I replace X by a data frame with a subset of the > rows of X: > > X <- X[ok,] > > where "ok" is a logical vector. When I do this the attributes of the > columns (which I need to retain) are lost (except for the "class" and > "levels" attributes of columns which are factors). > > Is there any sexy way to retain the attributes of the columns? > > So far the only approach that I can work out is to extract the > attributes prior to subsetting and put them back after subsetting. > > Like unto: > > SaveAt <- lapply(X,attributes) > X <- X[ok,] > lX <- lapply(names(X),function(nm,x,Sat){ > attributes(x[[nm]]) <- Sat[[nm]] > x[[nm]]},x=X,Sat=SaveAt) > names(lX) <- names(X) > X <- as.data.frame(lX) > > This seems to work, but is rather kludgy. Is there a better way? > > Thanks for any pointers. > > cheers, > > Rolf Turner > > -- > Honorary Research Fellow > Department of Statistics > University of Auckland > Phone: +64-9-373-7599 ext. 88276 > > ______________________________________________ > R-help at 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.
Rolf Turner
2019-Oct-20 02:13 UTC
[R] Retaining attributes of columns of a data frame when subsetting.
On 20/10/19 3:00 PM, Richard M. Heiberger wrote:> Look at > methods(as.data.frame) > Define your specialized columns to have a newly defined class, say "myclass". > Then write as.data.frame.myclass > It will be similar to the function you already have in the lapply statement. > Now your statement > X <- X[ok,] > should work.Yes. That idea does indeed look promising. I'll check it out. Thanks. cheers, Rolf -- Honorary Research Fellow Department of Statistics University of Auckland Phone: +64-9-373-7599 ext. 88276