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@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@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@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.

Reply via email to