Sorry, without remnants from other attempts: subset_ROW <- function(x, i) { nd <- length(dim(x)) if (nd <= 1L) return(x[i]) apply(x, 2:nd, `[`, i, drop=FALSE) } El vie., 8 jun. 2018 a las 19:07, Iñaki Úcar (<i.uca...@gmail.com>) escribió: > > El vie., 8 jun. 2018 a las 17:46, Hadley Wickham > (<h.wick...@gmail.com>) escribió: > > > > Hi all, > > > > Is there a better to way to subset the ROWs (in the sense of NROW) of > > an vector, matrix, data frame or array than this? > > > > subset_ROW <- function(x, i) { > > nd <- length(dim(x)) > > if (nd <= 1L) { > > x[i] > > } else { > > dims <- rep(list(quote(expr = )), nd - 1L) > > do.call(`[`, c(list(quote(x), quote(i)), dims, list(drop = FALSE))) > > } > > } > > > > subset_ROW(1:10, 4:6) > > #> [1] 4 5 6 > > > > str(subset_ROW(array(1:10, c(10)), 2:4)) > > #> int [1:3(1d)] 2 3 4 > > str(subset_ROW(array(1:10, c(10, 1)), 2:4)) > > #> int [1:3, 1] 2 3 4 > > str(subset_ROW(array(1:10, c(5, 2)), 2:4)) > > #> int [1:3, 1:2] 2 3 4 7 8 9 > > str(subset_ROW(array(1:10, c(10, 1, 1)), 2:4)) > > #> int [1:3, 1, 1] 2 3 4 > > > > subset_ROW(data.frame(x = 1:10, y = 10:1), 2:4) > > #> x y > > #> 2 2 9 > > #> 3 3 8 > > #> 4 4 7 > > > > It seems like there should be a way to do this that doesn't require > > generating a call with missing arguments, but I can't think of it. > > The following code seems to work. The only minor drawback is that, for > the last case, the output is not a data frame. > > subset_ROW <- function(x, i) { > nd <- length(dim(x)) > if (nd <= 1L) > return(x[i]) > xx <- apply(x, 2:nd, `[`, i, drop=FALSE) > dim(xx) <- c(length(i), dim(x)[-1]) > xx > } > > Iñaki > > > > > Thanks! > > > > Hadley > > > > -- > > http://hadley.nz > >
-- Iñaki Úcar http://www.enchufa2.es @Enchufa2 ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel