选择数据框中的多个奇数或偶数列/行

46

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

肯定有更简单的方法吧?


请查看?seq - alko989
2
请注意,您谈论的是选择列,但您的代码选择了第一列的行。 - Jilber Urbina
5个回答

86

当使用逻辑向量进行索引时,它们会被循环使用,因此这将获取您奇数列或奇数行。

 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的R 4.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

4
如果N变大,在“每N列/行”中,可以使用 c(TRUE, rep(FALSE,7)(其中7为N-1)作为可读性强且简洁的替代方案。 - Victor Klos
你能解释一下上面的代码吗?calld[ !c(TRUE,FALSE), ] - Standin.Wolf
@Standin.Wolf:不确定哪个部分让您感到困惑。 "!" 基本上是反转逻辑向量,因此它实际上的含义是:calld[c(FALSE,TRUE),] - IRTFM
3
很不幸,在R 4.0.0版本中,语法calld[, !c(TRUE, FALSE)]不再起作用。现在必须精确指定要重复的列或行的数量。 - Agile Bean
@AgileBean:我刚刚在一个简单的10列数据框上再次测试了它,对我来说似乎可以工作。如果您仍然看到未能遵守R的扩展向量的隐式重复(也称为“循环使用”)的不寻常特性的失败证据,则需要发布反例。 - IRTFM

41

我希望将 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行,当然。请参见这里

40

你可以使用seq生成序列:

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

那么,

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

我不明白为什么一个关于选择奇偶行或列的问题的被接受答案是关于生成奇数或偶数的数字。 - W Barker

7
使用%%结合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, ] )

1

这里是data.table的方法

  1. 创建一个包含10列和100行的简单data.table

df = data.table(sapply(1:10, rnorm, n=100))

  1. 获取偶数/奇数行:

偶数 df[df[, .I%%2==0]]df[seq(2,.N,2)]

奇数 df[df[, .I%%2==1]]df[seq(1,.N,2)]

  1. 获取偶数/奇数列

偶数 df[,.SD, .SDcols=seq(2,ncol(df),2)]

奇数 df[,.SD, .SDcols=seq(1,ncol(df),2)]


你能在括号内使用.SD吗? - Mali Remorker
嗯,不确定...你能展示一下你的意思吗? - langtang
1
@MaliRemorker,我添加了使用.SD选择奇数/偶数列的功能 - 谢谢! - langtang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接