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