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?
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])
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 , ....
I wish to add the tidyverse style approach to this problem, using the %% operator.
library(dplyr)
df <- data.frame(V1 = seq(26), V2 = letters)
df %>% dplyr::filter(row_number() %% 2 == 0) ## Select even rows
df %>% dplyr::filter(row_number() %% 2 == 1) ## Select odd rows
df %>% dplyr::filter(row_number() %% 3 == 1)
## Select every 3rd row starting from first row
You can use the same idea to delete every n-th row, of course. See here.
Use %% in combination with seq_len to create vector for indexing your data frame to find even and odds columns/rows
Try something like this:
even <- seq_len(ncol(data.pc)) %% 2 # index
x.loadings <- data.frame(x=data.pc$loadings[even, ])
y.loadings <- data.frame(x=data.pc$loadings[!even, ] )
来源:https://stackoverflow.com/questions/24440258/selecting-multiple-odd-or-even-columns-rows-for-dataframe