R 为数据帧选择多个奇数或偶数列/行
在R中是否有方法选择许多非连续的行/列,即奇数或偶数行/列 我正在绘制荷载图,以便进行主成分分析。我有84行数据按如下顺序排列:x_1 y_1 x_2。。。。。x_42 y_42 目前,我正在为x和y载荷创建数据帧,如下所示:R 为数据帧选择多个奇数或偶数列/行,r,dataframe,pca,R,Dataframe,Pca,在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
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])
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, ] )
当然有更简单的方法可以做到这一点吗?将%%与seq_len结合使用,创建用于索引数据帧的向量,以查找偶数和赔率列/行
试着这样做:
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])
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, ] )
您始终可以使用seq生成序列:
even_indexes<-seq(2,42,2)
odd_indexes<-seq(1,41,2)
那么
当逻辑向量用于索引时,它们被循环使用,这样就可以得到奇数列或奇数行
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 , ....
最近的一位评论者声称,这已经不起作用了。我没有发现在Ubuntu上运行的R4.0.4中:
> 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
我希望使用%%运算符添加tidyverse样式的方法来解决此问题
library(dplyr)
df <- data.frame(V1 = seq(26), V2 = letters)
df %>% filter(row_number() %% 2 == 0) ## Select even rows
df %>% filter(row_number() %% 2 == 1) ## Select odd rows
df %>% filter(row_number() %% 3 == 1) ## Select every 3rd row starting from first row
当然,您可以使用相同的方法删除第n行中的每一行。请参阅。查看?seq请注意,您正在谈论选择列,但您的代码从列1中选择行。请选择最佳答案。如果N在每N列/行中变大,则cTRUE、repFALSE、7(其中7为N-1)可作为可读且简明的替代方案。您能解释上述代码吗?calld[!cTRUE,FALSE,]@Standin.Wolf:不确定哪一部分让你困惑。这个基本上反转逻辑向量,因此它实际上意味着:在R4.0.0中calld[cFALSE,TRUE,]非常不幸的是,语法'calld[,!cTRUE,FALSE]`不再有效。您必须准确地指定要重复的正确列数或行数。@AgileBean:我刚刚在一个简单的10列数据帧上再次测试了它,它似乎对我有效。如果你仍然看到证据表明没有遵守R的不寻常的特性,即通过隐式重复循环来扩展向量,那么你需要发布一个反例。我不明白为什么对于选择奇偶行或列的问题,人们接受的答案是生成奇数或偶数。