Hi:

x <- matrix(20:35, ncol = 1)
u <- c(1, 4, 5, 6, 11)      # 'x values'
m <- c(1, 3, 1, 1, 0.5)

# Function to compute the inner product of the multipliers with the
extracted
# elements of x determined by u
f <- function(mat, inputs, mults) crossprod(mat[inputs], mults)
f(x, u, mults = c(1, 3, 1, 1, 0.5))
     [,1]
[1,]  153
20 + 23 * 3 + 24 + 25 + 30 * 0.5
[1] 153

The function is flexible enough to allow you to play with the input matrix
(although a vector would also work), the 'observation vector' inputs and the
set of multipliers. Here's one way (not necessarily the most efficient):

uv <- matrix(sample(1:15, 25, replace = TRUE), ncol = 5)
uv   # like an X matrix, where each row provides the input values of the
vars
     [,1] [,2] [,3] [,4] [,5]
[1,]   12    8   11   10   15
[2,]   15   11   14   14    8
[3,]    4    8    4   10   12
[4,]   10    5    2    1    7
[5,]   11    4    9    1   11

# Apply the function f to each row of uv:
apply(uv, 1, function(y) f(x, y, mults = c(1, 3, 1, 1, 0.5)))
[1] 188.0 203.5 171.5 155.0 162.0

The direct matrix version:
crossprod(t(matrix(x[uv], ncol = 5)), c(1, 3, 1, 1, 0.5))
      [,1]
[1,] 188.0
[2,] 203.5
[3,] 171.5
[4,] 155.0
[5,] 162.0

Notice that the apply() call returns a vector whereas crossprod() returns a
matrix.
x[uv] selects the x values associated with the indices in uv and returns a
vector in column-major order. The crossprod() call transposes the reshaped
x[uv] and then 'matrix' multiplies it by the vector c(1, 3, 1, 1, 0.5).

HTH,
Dennis

On Fri, Oct 29, 2010 at 3:54 PM, M.Ribeiro <mresende...@yahoo.com.br> wrote:

>
> So, I am having a tricky reference file to extract information from.
>
> The format of the file is
>
> x   1 + 4 * 3 + 5 + 6 + 11 * 0.5
>
> So, the elements that are not being multiplied (1, 5 and 6) and the
> elements
> before the multiplication sign (4 and 11) means actually the reference for
> the row in a matrix where I need to extract the element from.
>
> The numbers after the multiplication sign are regular numbers
> Ex:
>
> > x<-matrix(20:35)
> > x
>      [,1]
>  [1,]   20
>  [2,]   21
>  [3,]   22
>  [4,]   23
>  [5,]   24
>  [6,]   25
>  [7,]   26
>  [8,]   27
>  [9,]   28
> [10,]   29
> [11,]   30
> [12,]   31
> [13,]   32
> [14,]   33
> [15,]   34
> [16,]   35
>
> I would like to read the rows 1,4,5,6 and 11 and sum then. However the
> numbers in the elements row 4 and 11 are multiplied by 3 and 0.5
>
> So it would be
> 20 + 23 * 3 + 24 + 25 + 30 * 0.5.
>
> And I have this format in different files so I can't do all by hand.
> Can anybody help me with a script that can differentiate this?
> Thanks
> --
> View this message in context:
> http://r.789695.n4.nabble.com/Differenciate-numbers-from-reference-for-rows-tp3019853p3019853.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> R-help@r-project.org mailing list
> 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.
>

        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list
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.

Reply via email to