[R] Differenciate numbers from reference for rows
David Winsemius
dwinsemius at comcast.net
Sat Oct 30 13:13:03 CEST 2010
On Oct 29, 2010, at 11:16 PM, Dennis Murphy wrote:
> 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
> <mresendeufv at 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
I saw the beginning of this task as parsing to extract the digits from
a character string (possibly decimal digits in the case of the third
and seventh positions) delimited by <space>+<space> and <space>*<space>:
library(gsubfn)
> x <- "1 + 4 * 3 + 5 + 6 + 11 * 0.5"
xin <- readLines(textConnection(x))
xp <- strapply(xin, "^(\\d+) \\+ (\\d+) \\* (\\d+\\.*\\d*) \\+ (\\d
+) \\+ (\\d+) \\+ (\\d+) \\* (\\d+\\.*\\d*)", c)
sapply(xp, as.numeric)
[,1]
[1,] 1.0
[2,] 4.0
[3,] 3.0
[4,] 5.0
[5,] 6.0
[6,] 11.0
[7,] 0.5
--
David
>>
>> 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 at 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 at 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.
David Winsemius, MD
West Hartford, CT
More information about the R-help
mailing list