根据模式选择列

Selecting columns based on pattern

可能重复: Extracting specific columns from a data frame

我有一个数据框,它遵循列中的模式。这里我有大约 10 列,但实际上在最终数据框中,列数是未知的,因为它取决于给定的数据。

  V1    V2   V3          V4       V5   V6          V7     V8    V9          V10           
ADAM32  P 0.001000000   40.61038  P 0.001000000   40.61038  P 0.001000000   40.61038
CCL5    P 0.000491000 6546.20000  P 0.000491000 6546.20000  P 0.000491000 6546.20000
CILP2   A 0.500000024   92.66398  A 0.500000024   92.66398  A 0.500000024   92.66398
EPHB3   P 0.000562000  461.30000  P 0.000562000  461.30000  P 0.000562000  461.30000
GUCA1A  P 0.002006000    9.40000  P 0.002006000    9.40000  P 0.002006000    9.40000
HSPA6   P 0.000322000  564.00000  P 0.000322000  564.00000  P 0.000322000  564.00000
MAPK1   P 0.002000000  435.00000  P 0.002000000  435.00000  P 0.002000000  435.00000
PIGX    P 0.003822926  411.38856  P 0.003822926  411.38856  P 0.003822926  411.38856
PTPN21  M 0.051040220   94.30000  M 0.051040220   94.30000  M 0.051040220   94.30000
THRA    M 0.054470000  151.10000  M 0.054470000  151.10000  M 0.054470000  151.10000
UBA7    P 0.000468000  845.60000  P 0.000468000  845.60000  P 0.000468000  845.60000
WFDC2   P 0.005475547  177.61689  P 0.005475547  177.61689  P 0.005475547  177.61689
7-Mar   P 0.000673000  643.20000  P 0.000673000  643.20000  P 0.000673000  643.20000

在上面的数据框中,我想要前两列,然后是两列之后的列,两列之后的列,等等。因此我想要 v1、v2、v5、v8 等等,直到数据帧用完。因此,如果我有一个包含 1000 列的相同模式的数据框,我该如何 select 列?

预期输出:

     V1 V2  V5  V8
 ADAM32  P   P  P
   CCL5  P   P  P 
  CILP2  A   A  A
  EPHB3  P   P  P
 GUCA1A  P   P  P
  HSPA6  P   P  P
  MAPK1  P   P  P
   PIGX  P   P  P
 PTPN21  M   M  M
   THRA  M   M  M
   UBA7  P   P  P
  WFDC2  P   P  P
  7-Mar  P   P  P

如果标准是 select 只有非数字的列,您可以使用过滤器:

Filter(Negate(is.numeric), df)

虚拟数据示例:

df = data.frame('a','b',1,2,'c',23,45.0,'c')
Filter(function(u) !is.numeric(u), df)
#  X.a. X.b. X.c. X.c..1
#1    a    b    c      c

到select第一列,第二列,第五列,第八列等等,你也可以试试:

df[,c(1,(1:ceiling(length(df)/3))*3-1)]

seq 函数可以通过以下方式帮助解决此问题:

df <- read.table('clipboard',header=T)

df[, c(1,2,seq(5,ncol(df),3))]

       V1 V2 V5 V8
1  ADAM32  P  P  P
2    CCL5  P  P  P
3   CILP2  A  A  A
4   EPHB3  P  P  P
5  GUCA1A  P  P  P
6   HSPA6  P  P  P
7   MAPK1  P  P  P
8    PIGX  P  P  P
9  PTPN21  M  M  M
10   THRA  M  M  M
11   UBA7  P  P  P
12  WFDC2  P  P  P
13  7-Mar  P  P  P

本质上 seq 根据需要创建序列,即从 5 开始直到列的总数和 returns 每两列一个列索引。在此我只是根据需要添加了第一列和第二列。