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
Rui Barradas
2019-Oct-20 12:15 UTC
[R] Retaining attributes of columns of a data frame when subsetting.
Hello, Richard's idea is good but shouldn't it be `[.myclass` instead? `[.myclass` <- function(x, i, j, drop = if (missing(i)) TRUE else length(cols) == 1){ SaveAt <- lapply(X, attributes) X <- NextMethod() 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) X } X <- data.frame(a = letters[1:5], x = 1:5) class(X) <- c("myclass", class(X)) attr(X$a, "attr_a1") <- "first_a" attr(X$a, "attr_a2") <- "second_a" str(X) ok <- c(1, 3, 4) X <- X[ok, ] str(X) Hope this helps, Rui Barradas ?s 03:13 de 20/10/19, Rolf Turner escreveu:> 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 >
Rolf Turner
2019-Oct-20 21:55 UTC
[R] Retaining attributes of columns of a data frame when subsetting.
On 21/10/19 1:15 AM, Rui Barradas wrote:> Hello, > > Richard's idea is good but shouldn't it be `[.myclass` instead?Yes, I kind of thought that, and cobbled together something on that basis that seemed to work. However my code was rather a hodge-podge. I kept having to work around errors that I didn't understand. You seem to have a much clearer understanding of what's going on, and your code is much cleaner than what I came up with.> > > `[.myclass` <- function(x, i, j, drop = if (missing(i)) TRUE else > length(cols) == 1){ > ? SaveAt <- lapply(X, attributes) > ? X <- NextMethod() > ? 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) > ? X > }But in the foregoing there seems to me to be some inconsistency in the use of "X" and "x". Should not the first function argument be "X" rather than "x"? Or perhaps the "X" symbols in the code should be replaced by "x"? As in: SaveAt <- lapply(x, attributes) x <- NextMethod() .... .... Or am I misunderstanding what's going on (as is so often the case! :-( )?> X <- data.frame(a = letters[1:5], x = 1:5) > class(X) <- c("myclass", class(X)) > attr(X$a, "attr_a1") <- "first_a" > attr(X$a, "attr_a2") <- "second_a" > str(X) > > ok <- c(1, 3, 4) > X <- X[ok, ] > str(X) > > > Hope this helps,Quite a lot! But I'd appreciate clarification w.r.t. the misgiving that I expressed above. Thanks. cheers, Rolf -- Honorary Research Fellow Department of Statistics University of Auckland Phone: +64-9-373-7599 ext. 88276