根据模式选择列

时间:2015-04-04 16:31:07

标签: r dataframe multiple-columns

可能重复:  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列的数据框,我该如何选择列?

预期产出:

     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

2 个答案:

答案 0 :(得分:5)

如果标准是仅选择非数字的colomuns,则可以使用filter:

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

要选择第一列,第二列,第五列,第八列等,您还可以尝试:

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

答案 1 :(得分:2)

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开始直到列总数,并且每两列返回一个列索引。在这里我只是添加了你想要的第一和第二列。