为数据帧选择多个奇数或偶数列/行

dmt*_*dmt 29 r pca dataframe

在R中有没有办法选择许多非连续的,即奇数或偶数行/列?

我正在绘制我的主成分分析的负载.我有84行数据如下:x_1 y_1 x_2.....x_42 y_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])
Run Code Online (Sandbox Code Playgroud)

当然有更简单的方法吗?

42-*_*42- 61

当逻辑向量用于索引时,它们被循环使用,这样就可以获得奇数列或奇数行

 calld[ c(TRUE,FALSE), ]  # rows
 calld[ , c(TRUE,FALSE) ] #columns
Run Code Online (Sandbox Code Playgroud)

甚至是行或列:

 calld[ !c(TRUE,FALSE), ]  # rows
 calld[ , !c(TRUE,FALSE) ] #columns
Run Code Online (Sandbox Code Playgroud)

每三栏:

  calld[ , c(TRUE,FALSE, FALSE) ]   #columns 1,4,7 , ....
Run Code Online (Sandbox Code Playgroud)

  • 贝斯特回答.如果N在"每第N列/行"中变大,那么`c(TRUE,rep(FALSE,7)`(7为N-1)可以用作可读和简洁的替代. (3认同)
  • 非常不幸的是,在“R 4.0.0”中,语法“calld[,!c(TRUE,FALSE)]”不再起作用。您必须准确指定要重复的正确列数或行数。 (2认同)

Mal*_*ker 29

您始终可以使用seq生成序列:

even_indexes<-seq(2,42,2)
odd_indexes<-seq(1,41,2)
Run Code Online (Sandbox Code Playgroud)

然后,

  x.loadings <- data.frame(x=data.pc$loadings[odd_indexes,1])
Run Code Online (Sandbox Code Playgroud)


Kim*_*Kim 15

我希望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
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用相同的想法删除每第n行.看到这里.


Jil*_*ina 6

%%结合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, ] )
Run Code Online (Sandbox Code Playgroud)