在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])
当然有更简单的方法吗?
答案 0 :(得分:55)
当逻辑向量用于索引时,它们被循环使用,这样就可以得到奇数列或奇数行
calld[ c(TRUE,FALSE), ] # rows
calld[ , c(TRUE,FALSE) ] #columns
偶数行或列:
calld[ !c(TRUE,FALSE), ] # rows
calld[ , !c(TRUE,FALSE) ] #columns
每三栏:
calld[ , c(TRUE,FALSE, FALSE) ] #columns 1,4,7 , ....
答案 1 :(得分:27)
您始终可以使用seq生成序列:
even_indexes<-seq(2,42,2)
odd_indexes<-seq(1,41,2)
然后,
x.loadings <- data.frame(x=data.pc$loadings[odd_indexes,1])
答案 2 :(得分:10)
我希望使用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行。请参阅here。
答案 3 :(得分:2)
将%%
与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, ] )