Row/column counter in 'apply' functions

后端 未结 5 489
遥遥无期
遥遥无期 2020-12-08 04:32

What if one wants to apply a functon i.e. to each row of a matrix, but also wants to use as an argument for this function the number of that row. As an example,

相关标签:
5条回答
  • 2020-12-08 05:07

    I'm a little confuse so excuse me if I get this wrong but you want work out n-th root of the numbers in each row of a matrix where n = the row number. If this this the case then its really simple create a new array with the same dimensions as the original with each column having the same values as the corresponding row number:

    test_row_order = array(seq(1:length(test[,1]), dim = dim(test))
    

    Then simply apply a function (the n-th root in this case):

    n_root = test^(1/test_row_order)
    
    0 讨论(0)
  • 2020-12-08 05:13

    If you give the function a name rather than making it anonymous, you can pass arguments more easily. We can use nrow to get the number of rows and pass a vector of the row numbers in as a parameter, along with the frame to be indexed this way.

    For clarity I used a different example function; this example multiplies column x by column y for a 2 column matrix:

    test <- data.frame(x=c(26,21,20),y=c(34,29,28))
    myfun <- function(position, df) {
        print(df[position,1] * df[position,2])
    }
    
    positions <- 1:nrow(test)
    lapply(positions, myfun, test)
    
    0 讨论(0)
  • 2020-12-08 05:21

    cbind()ing the row numbers seems a pretty straightforward approach. For a matrix (or a data frame) the following should work:

    apply( cbind(1:(dim(test)[1]), test), 1, function(x) plot(x[-1], main=x[1]) )
    

    or whatever you want to plot.

    0 讨论(0)
  • 2020-12-08 05:27

    Actually, in the case of a matrix, you don't even need apply. Just:

    test^(1/row(test))
    

    does what you want, I think. I think the row() function is the thing you are looking for.

    0 讨论(0)
  • 2020-12-08 05:30

    What I usually do is to run sapply on the row numbers 1:nrow(test) instead of test, and use test[i,] inside the function:

    t(sapply(1:nrow(test), function(i) test[i,]^(1/i)))
    

    I am not sure this is really efficient, though.

    0 讨论(0)
提交回复
热议问题