[Rd] Subsetting the "ROW"s of an object

Berry, Charles ccberry @ending from uc@d@edu
Fri Jun 8 19:16:17 CEST 2018



> On Jun 8, 2018, at 8:45 AM, Hadley Wickham <h.wickham using gmail.com> wrote:
> 
> 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?


You can use TRUE to fill the subscripts for dimensions 2:nd

> 
> 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 <-
    function(x,i)
{
    mc <- quote(x[i])
    nd <- max(1L, length(dim(x)))
    mc[seq(4, length=nd-1L)] <- rep(list(TRUE), nd - 1L)
    mc[["drop"]] <- FALSE
    eval(mc)
    
}

> 
> 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
> 

HTH,

Chuck



More information about the R-devel mailing list