Is there a way in R to select many non-consecutive i.e. odd or even rows/columns?
I'm plotting the loadings for my Principal Components Analysis.  I have 84 rows of data ordered like this: x_1 y_1 x_2..... x_42   y_42 
And at the moment I am creating the dataframes for the x and y loadings figures like this:
data.pc = princomp(as.matrix(data))  x.loadings <- data.frame(x=data.pc$loadings[c(1, 3, 5, 7, 9, 11, 13 ,15, 17, 19,  21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41), 1])  yloadings <- data.frame(y=data.pc$loadings[c(2, 4, 6, 8, 10, 12, 14, 16, 18, 20,  22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42), 1])   Surely there's an easier way to do this?
Getting Odd Rows from the Data FrameThe number of rows in a data frame in R can be fetched by the nrow() method. It returns the number of rows in the data frame. The seq_len() method is then applied to generate the integers beginning with 1 to the number of rows.
The simplest way to select every other row in Excel is to hold down down the CTRL button on your keyboard (⌘ on MAC) and then the number of the rows you want to select.
To find the position of odd numbers in an R vector, we can find the position of values that are divisible by 2 with the help of which function. For example, if we have a vector called x then we can find the position of odd numbers using the command which(x%%2==1).
When logical vectors are used for indexing, they are recycled so this gets you odd columns or odd rows
 calld[ c(TRUE,FALSE), ]  # rows  calld[ , c(TRUE,FALSE) ] #columns  Even rows or columns:
 calld[ !c(TRUE,FALSE), ]  # rows  calld[ , !c(TRUE,FALSE) ] #columns  Every third column:
  calld[ , c(TRUE,FALSE, FALSE) ]   #columns 1,4,7 , ....  A recent commenter claims this no longer works. I'm not finding that in R 4.0.4 running in Ubuntu:
> d <- data.frame(as.list(1:10))  # simple example construction > d   X1L X2L X3L X4L X5L X6L X7L X8L X9L X10L 1   1   2   3   4   5   6   7   8   9   10 > d[, c(TRUE,FALSE)]   X1L X3L X5L X7L X9L 1   1   3   5   7   9 > d[, c(TRUE,FALSE,FALSE)]  # example: # of columns not exact multiple of length of logical vector   X1L X4L X7L X10L 1   1   4   7   10 
                        You can always generate sequences with seq:
even_indexes<-seq(2,42,2) odd_indexes<-seq(1,41,2)   Then,
  x.loadings <- data.frame(x=data.pc$loadings[odd_indexes,1]) 
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With