[R] Find the max entry in column 2 - that satisfies a condition given a fixed entry in column 1

Rui Barradas ru|pb@rr@d@@ @end|ng |rom @@po@pt
Fri Jun 21 08:23:15 CEST 2019


Hello,

Thinking again, if all you want is vector b the following function fun2 
will do it without having to create plain. Less memory and (much) faster.

fun2 <- function(X, val){
   u <- sort(unique(X))
   n <- length(u)
   b <- numeric(n^2)
   b[n*(n - 1) + match(val, u)] <- u[n]
   b
}

fun2(c(0, x), 0)
fun2(c(0, x), 1)
fun2(c(0, x), 2)


Hope this helps,

Rui Barradas

Às 06:47 de 21/06/19, Rui Barradas escreveu:
> Hello,
> 
> Inline.
> 
> Às 10:15 de 20/06/19, Vangelis Litos escreveu:
>> I am using R and I created based on a vector x, a grid (named: plain) 
>> - where zero is included. This gives me a 9x2 ``matrix''.
>>
>>> x_t = cbind(c(1),c(2));
>>> x = t(x_t);
> 
> This code works but there are several issues with it.
> 
> 1) c(1) is exactly the same as just 1. Try running
> 
> identical(c(1), 1)
> 
> 2) You end the line with a semi-colon. This is not needed.
> In fact,
> 
> the semi-colon is the INSTRUCTIONS SEPARATOR
> 
> so what you end up with is 2 instructions, one on the left of the ; and 
> the other, the NULL instruction, on the right. What the parser sees and 
> processes is
> 
> instruction;NULL
> 
> 3) Then in the next line you transpose the matrix you have created. Much 
>   simpler:
> 
> y <- rbind(1, 2)
> identical(x, y)    # TRUE
> 
> 
>>
>>> plain = expand.grid (sort (unique (c (0, x))), sort (unique (c (0, 
>>> x))));
> 
> 
> 4) Now you combine the matrix you have created with a new element, 0.
> 
> c(0, x)
> 
> The output of this is no longer a matrix, it's a vector without the dim 
> attribute.
> 
> identical(c(0, x), c(0, 1, 2))    # TRUE
> 
> 
>>
>> My aim is to focus on column 1 and take i.e the first entry (then the 
>> second, the third entry etc through a loop) of the unique (c (0, x)) 
>> vector (==0) [rows 1, 4 and 7] and find the maximum value (entry) in 
>> the second column of the matrix that satisfies a condition.
>>
>> Let say that the condition is satisfied when at column 2 the value is 
>> 2. That is I want row 7 to be selected
>>
> 
> 
> The following function does this.
> 
> 
> fun <- function(X, val){
>    u <- sort(unique(X))
>    plain <- expand.grid(u, u)
>    w <- which(plain[, 1] == val)
>    w[which.max(plain[w, 2])]
> }
> 
> fun(c(0, x), 0)
> #[1] 7
> fun(c(x, 0, x), 0)
> #[1] 7
> 
> 
>> Then I want to create a column vector b (9x1) that has zero everywhere 
>> apart from row 7.
> 
> 
> And what would be the non-zero value? The max in column 2?
> 
> b <- numeric(nrow(plain))    # creates a vector of 9 zeros
> i <- fun(c(0, x), 0)
> b[i] <- new_value
> 
> # or maybe
> 
> b[i] <- plain[i, 2]
> 
> 
> The first and the last instructions have an obvious problem, 'plain' 
> only exists inside the function fun(), it will have to be created 
> elsewhere.
> 
> 
> Hope this helps,
> 
> Rui Barradas
>>
>> Can anybody help me with this?
>>
>> Thank you in advance.
>>
>>     [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> 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.
>>
> 
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.



More information about the R-help mailing list