Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selecting multiple odd or even columns/rows for dataframe

Tags:

dataframe

r

pca

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?

like image 718
dmt Avatar asked Jun 26 '14 21:06

dmt


People also ask

How do I select odd rows in R?

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.

How do you select odd 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.

How do you filter odd numbers in R?

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


2 Answers

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 
like image 129
IRTFM Avatar answered Sep 27 '22 17:09

IRTFM


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]) 
like image 34
Mali Remorker Avatar answered Sep 27 '22 19:09

Mali Remorker