web-dev-qa-db-ja.com

データフレームに複数の奇数または偶数の列/行を選択する

Rで多くの非連続、つまり奇数または偶数の行/列を選択する方法はありますか?

主成分分析の負荷をプロットしています。このように順序付けられたデータの84行があります:x_1y_1x_2..... x_42y_42

そして、現時点では、次のようなxおよびy負荷数値のデータフレームを作成しています。

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

確かにこれを行う簡単な方法はありますか?

28
dmt

Seqでいつでもシーケンスを生成できます:

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

その後、

  x.loadings <- data.frame(x=data.pc$loadings[odd_indexes,1])
29
Mali Remorker

論理ベクトルがインデックス付けに使用される場合、それらはリサイクルされるため、奇数列または奇数行が取得されます

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

偶数行または偶数列:

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

3列ごと:

  calld[ , c(TRUE,FALSE, FALSE) ]   #columns 1,4,7 , ....
61
42-

%%演算子を使用して、この問題にtidyverseスタイルのアプローチを追加したいと思います。

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

もちろん、n番目の行ごとにdeleteに同じアイデアを使用できます。 here を参照してください。

12
Kim

つかいます %%と組み合わせてseq_lenデータフレームにインデックスを付けるためのベクトルを作成して、偶数列とオッズ列/行を見つける

次のようなものを試してください:

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
Jilber Urbina