Switching the first element with the last one in a loop - r

Is there a function in R which switches the first element with the last one in a vector? I have a for loop which need that reordering. From:
months = seq(1:12)
[1] 1 2 3 4 5 6 7 8 9 10 11 12
I would like to have:
[1] 12 1 2 3 4 5 6 7 8 9 10 11
and then again:
[1] 11 12 1 2 3 4 5 6 7 8 9 10
...
until the 12th position.

If you need a matrix output
cbind(c(months),embed(c(months, months), 12)[-13,-12])
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
# [1,] 1 12 11 10 9 8 7 6 5 4 3 2
# [2,] 2 1 12 11 10 9 8 7 6 5 4 3
# [3,] 3 2 1 12 11 10 9 8 7 6 5 4
# [4,] 4 3 2 1 12 11 10 9 8 7 6 5
# [5,] 5 4 3 2 1 12 11 10 9 8 7 6
# [6,] 6 5 4 3 2 1 12 11 10 9 8 7
# [7,] 7 6 5 4 3 2 1 12 11 10 9 8
# [8,] 8 7 6 5 4 3 2 1 12 11 10 9
# [9,] 9 8 7 6 5 4 3 2 1 12 11 10
#[10,] 10 9 8 7 6 5 4 3 2 1 12 11
#[11,] 11 10 9 8 7 6 5 4 3 2 1 12
#[12,] 12 11 10 9 8 7 6 5 4 3 2 1
Or another approached suggested by #Marat Talipov
z <- length(months)
i <- rep(seq(z),z) + rep(seq(z),each=z) - 1
matrix(months[ifelse(i>z,i-z,i)],ncol=z)

I'm afraid that you have to come up with a home-made function, something like this one:
rotate <- function(v,i=1) {
i <- i %% length(v)
if (i==0) return(v)
v[c(seq(i+1,length(v)),seq(i))]
}
Couple of examples:
v <- seq(12)
rotate(v,1)
# [1] 2 3 4 5 6 7 8 9 10 11 12 1
rotate(v,-1)
# [1] 12 1 2 3 4 5 6 7 8 9 10 11

You can also use tail and head functions:
x = c(tail(x,n), head(x,-n))
and modify n to rotate n times

The permute package can do this for you:
ap <- allPerms(length(months),
control = how(within = Within(type = "series"),
observed = TRUE))
ap[rev(seq_len(nrow(ap))), ]
(because of the way allPerms() does its work, we need to reverse the order of the rows, which is what the last line does.)
This gives:
> ap[rev(seq_len(nrow(ap))), ]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,] 1 2 3 4 5 6 7 8 9 10 11 12
[2,] 12 1 2 3 4 5 6 7 8 9 10 11
[3,] 11 12 1 2 3 4 5 6 7 8 9 10
[4,] 10 11 12 1 2 3 4 5 6 7 8 9
[5,] 9 10 11 12 1 2 3 4 5 6 7 8
[6,] 8 9 10 11 12 1 2 3 4 5 6 7
[7,] 7 8 9 10 11 12 1 2 3 4 5 6
[8,] 6 7 8 9 10 11 12 1 2 3 4 5
[9,] 5 6 7 8 9 10 11 12 1 2 3 4
[10,] 4 5 6 7 8 9 10 11 12 1 2 3
[11,] 3 4 5 6 7 8 9 10 11 12 1 2
[12,] 2 3 4 5 6 7 8 9 10 11 12 1
Technically this only works because months is the vector 1:12 and allPerms() returns a permutation matrix of the indices of the thing you want permuted. For different inputs, use ap to index into the thing you want to permute
perms <- ap
perms[] <- months[ap[rev(seq_len(nrow(ap))), ]]
perms

Related

how to assign the size of 2-D matrix to two new variable in r?

This is what I know in Matlab and want do same in r programming
A=[1 2 3;4 5 6; 7 8 9];
A =
1 2 3
4 5 6
7 8 9
[m,n]=size(A)
m=3
n=3
so here I have two distinct variables to which the dimension or size of 2D matrix is assigned automatically
> x<-c(1:10)
> x
[1] 1 2 3 4 5 6 7 8 9 10
> A=matrix(0,10,10)
> A=Toeplitz(x,c(x[1],rev(x[-1])))
> A
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 10 9 8 7 6 5 4 3 2
[2,] 2 1 10 9 8 7 6 5 4 3
[3,] 3 2 1 10 9 8 7 6 5 4
[4,] 4 3 2 1 10 9 8 7 6 5
[5,] 5 4 3 2 1 10 9 8 7 6
[6,] 6 5 4 3 2 1 10 9 8 7
[7,] 7 6 5 4 3 2 1 10 9 8
[8,] 8 7 6 5 4 3 2 1 10 9
[9,] 9 8 7 6 5 4 3 2 1 10
[10,] 10 9 8 7 6 5 4 3 2 1
> n=size(A)
> n
[1] 10 10
>[ m,n]=size(A)
this is not working so is there any way to assign the size of the 2Dmatrix to two distinct variable m and n in r.I am learning r programming and need help

Unable to store values in a numeric array inside for loop

I am trying to store values into a numeric array using a sliding window. However, I am not able to store values using the following code -
d=c(1:1000)
e=0
for (i in d){
a[e]=c(i:i+10)
e=e+1
}
I am looking to see -
a[1]=1 2 3 4 5 6 7 8 9 10
a[2]=2 3 4 5 6 7 8 9 10 11
You might use embed and then apply to reverse each row
x <- 1:20
t(apply(embed(x, 10), 1, rev))
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] 1 2 3 4 5 6 7 8 9 10
# [2,] 2 3 4 5 6 7 8 9 10 11
# [3,] 3 4 5 6 7 8 9 10 11 12
# [4,] 4 5 6 7 8 9 10 11 12 13
# [5,] 5 6 7 8 9 10 11 12 13 14
# [6,] 6 7 8 9 10 11 12 13 14 15
# [7,] 7 8 9 10 11 12 13 14 15 16
# [8,] 8 9 10 11 12 13 14 15 16 17
# [9,] 9 10 11 12 13 14 15 16 17 18
#[10,] 10 11 12 13 14 15 16 17 18 19
#[11,] 11 12 13 14 15 16 17 18 19 20
This might be a faster option of the same idea
out <- embed(x, 10)
out[, ncol(out):1]
Returning a list:
first <- c(0:9)
a <-lapply(1:1000, function(x) first+x)
a[1] 1 2 3 4 5 6 7 8 9 10
a[2] 2 3 4 5 6 7 8 9 10 11
a[3] 3 4 5 6 7 8 9 10 11 12
Does it need to be an array? The following makes a matrix:
sapply(1:10, function(i) i:(i+10))
This may work depending on the downstream application. If it has to be an array, check out How to convert matrix into array?
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 2 3 4 5 6 7 8 9 10
[2,] 2 3 4 5 6 7 8 9 10 11
[3,] 3 4 5 6 7 8 9 10 11 12
[4,] 4 5 6 7 8 9 10 11 12 13
[5,] 5 6 7 8 9 10 11 12 13 14
[6,] 6 7 8 9 10 11 12 13 14 15
[7,] 7 8 9 10 11 12 13 14 15 16
[8,] 8 9 10 11 12 13 14 15 16 17
[9,] 9 10 11 12 13 14 15 16 17 18
[10,] 10 11 12 13 14 15 16 17 18 19
[11,] 11 12 13 14 15 16 17 18 19 20

Creating matrix based on knowing the dimensions in a pattern

I tried to solve a problem programmatically, but was unsuccessful. Here are some of the the examples to generate
cbind(1:12,13:2,3:14,15:4,5:16,17:6,7:18,19:8,9:20,21:10)
cbind(1:11,12:2,3:13,14:4,5:15,16:6,7:17,18:8,9:19)
Looking for a general solution for this problem. If the number of columns and rows are given, the program should output the matrix. Thanks.
You can do it fairly easily using apply. Just generate the matrix columns counting y steps up from the column number, and reverse the even columns;
> x=5; y=7
> apply(t(1:x), 2, function(x) if(x%%2) x-1+1:y else x-1+y:1)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 8 3 10 5
[2,] 2 7 4 9 6
[3,] 3 6 5 8 7
[4,] 4 5 6 7 8
[5,] 5 4 7 6 9
[6,] 6 3 8 5 10
[7,] 7 2 9 4 11
m = embed(1:19, 9)
m[, seq(2, ncol(m), by=2)] = m[nrow(m):1, seq(2, ncol(m), by=2)]
m[,ncol(m):1]
produces
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 1 12 3 14 5 16 7 18 9
[2,] 2 11 4 13 6 15 8 17 10
[3,] 3 10 5 12 7 14 9 16 11
[4,] 4 9 6 11 8 13 10 15 12
[5,] 5 8 7 10 9 12 11 14 13
[6,] 6 7 8 9 10 11 12 13 14
[7,] 7 6 9 8 11 10 13 12 15
[8,] 8 5 10 7 12 9 14 11 16
[9,] 9 4 11 6 13 8 15 10 17
[10,] 10 3 12 5 14 7 16 9 18
[11,] 11 2 13 4 15 6 17 8 19

Creating matrix of colnumbers from a vector

Let's say, I have a vector of size 10. How do I create a matrix with position of vector elements arranged like this.
1 2 3 4 5 6 7 8 9 10
2 3 4 5 6 7 8 9 10 1
3 4 5 6 7 8 9 10 1 2
4 5 6 7 8 9 10 1 2 3
5 6 7 8 9 10 1 2 3 4
6 7 8 9 10 1 2 3 4 5
7 8 9 10 1 2 3 4 5 6
8 9 10 1 2 3 4 5 6 7
9 10 1 2 3 4 5 6 7 8
10 1 2 3 4 5 6 7 8 9
You could:
x = 1:10
matrix(x, nrow = length(x), ncol = length(x) + 1, byrow = T)[, -(length(x) + 1)]
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] 1 2 3 4 5 6 7 8 9 10
# [2,] 2 3 4 5 6 7 8 9 10 1
# [3,] 3 4 5 6 7 8 9 10 1 2
# [4,] 4 5 6 7 8 9 10 1 2 3
# [5,] 5 6 7 8 9 10 1 2 3 4
# [6,] 6 7 8 9 10 1 2 3 4 5
# [7,] 7 8 9 10 1 2 3 4 5 6
# [8,] 8 9 10 1 2 3 4 5 6 7
# [9,] 9 10 1 2 3 4 5 6 7 8
#[10,] 10 1 2 3 4 5 6 7 8 9
As #flodel noted in the comments, you could, also, build the matrix with an extra row and remove it. And, also, use nicer format: head(matrix(x, nrow = length(x) + 1 , ncol = length(x)), -1).
How about this?
sapply(1:10, function(idx){
vec <- 1:10
if(idx != 1){
vec <- c(vec[idx:10], 1:(idx-1))
}
vec
}
)

to find most frequently occuring element in matrix in R

Is there any function in R to find most frequently occuring element in matrix??I Have a matrix containing image pixels.I want to find which image pixel occur most frequently in the image matrix.I dont want to use the for loops since it would be very time taking to iterate over all the pixels of an image.
Set up some test data.
> (image = matrix(sample(1:10, 100, replace = TRUE), nrow = 10))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 4 4 2 7 2 2 3 8 2 5
[2,] 7 3 2 6 6 5 7 8 1 3
[3,] 7 5 7 9 4 9 4 8 2 7
[4,] 5 3 4 2 1 5 9 10 9 5
[5,] 9 10 7 2 7 4 9 1 1 9
[6,] 2 3 5 1 2 8 1 5 9 4
[7,] 5 4 10 5 9 10 1 6 1 10
[8,] 6 3 9 7 1 1 9 2 1 7
[9,] 5 9 4 8 9 9 5 10 5 4
[10,] 10 1 4 7 3 2 3 5 4 5
Do it manually.
> table(image)
image
1 2 3 4 5 6 7 8 9 10
12 12 8 12 15 4 11 5 14 7
Here we can see that the value 5 appeared most often (15 times). To get the same results programmatically:
> which.max(table(image))
5
5
Get mode (or majority value) in 1 line of code
using set.seed to generate same random matrix
> set.seed(123)
> image = matrix(sample(1:10, 100, replace = TRUE), nrow = 10)
> image
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 3 10 9 10 2 1 7 8 3 2
[2,] 8 5 7 10 5 5 1 7 7 7
[3,] 5 7 7 7 5 8 4 8 5 4
[4,] 9 6 10 8 4 2 3 1 8 7
[5,] 10 2 7 1 2 6 9 5 2 4
[6,] 1 9 8 5 2 3 5 3 5 2
[7,] 6 3 6 8 3 2 9 4 10 8
[8,] 9 1 6 3 5 8 9 7 9 1
[9,] 6 4 3 4 3 9 8 4 9 5
[10,] 5 10 2 3 9 4 5 2 2 6)
Mode value of matrix (if tie, its gives minimum tie value)
> names(which.max(table(image)))
[1] "5"
I do not know any function to do that directly but you can use these functions:
sort(table(as.vector(Matrix))

Resources