Sélection de plusieurs colonnes/lignes impaires ou paires pour dataframe

y a-t-il un moyen en R de sélectionner plusieurs lignes/colonnes non consécutives, c'est-à-dire impaires ou paires?

je trace les charges pour L'analyse de mes Composants principaux. J'ai 84 lignes de données ordonnées comme ceci: x_1 y_1 x_2 ..... x_42 y_42

et en ce moment je crée les images de données pour les chargements x et y comme ceci:

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

sûrement il y a un moyen plus facile pour ce faire?

20
demandé sur lmo 2014-06-27 01:08:06

4 réponses

vous pouvez toujours générer des séquences avec seq:

even_indexes<-seq(2,42,2)
odd_indexes<-seq(1,41,2)

Puis,

  x.loadings <- data.frame(x=data.pc$loadings[odd_indexes,1])
23
répondu Mali Remorker 2014-06-26 21:15:57

lorsque des vecteurs logiques sont utilisés pour l'indexation, ils sont recyclés de sorte que vous obtenez des colonnes ou des lignes impaires

 calld[ c(TRUE,FALSE), ]  # rows
 calld[ , c(TRUE,FALSE) ] #columns

lignes ou colonnes paires:

 calld[ !c(TRUE,FALSE), ]  # rows
 calld[ , !c(TRUE,FALSE) ] #columns

chaque troisième colonne:

  calld[ , c(TRUE,FALSE, FALSE) ]   #columns 1,4,7 , ....
47
répondu 42- 2014-06-26 23:24:27

je souhaite ajouter l'approche de style tidyverse à ce problème, en utilisant l'opérateur %% .

library(dplyr)
df <- data_frame(V1 = seq(1, 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

vous pouvez utiliser la même idée pour supprimer chaque n-ème ligne, bien sûr. Voir ici .

3
répondu Kim 2018-05-04 00:24:57

utilisez %% en combinaison avec seq_len pour créer un vecteur pour indexer votre base de données afin de trouver les colonnes/rangées Pair et cotes

Essayez quelque chose comme ceci:

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, ] )
2
répondu Jilber Urbina 2014-06-26 21:23:40