# [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,

À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)
> # 7
> fun(c(x, 0, x), 0)
> # 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,
>
>>
>> Can anybody help me with this?
>>
>>
>>     [[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
>> 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