【问题标题】:Selecting columns based on pattern根据模式选择列
【发布时间】:2015-04-04 16:31:07
【问题描述】:

可能重复: 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

【问题讨论】:

    标签: r dataframe multiple-columns


    【解决方案1】:

    如果条件是只选择非数字的列,你可以使用过滤器:

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

    【讨论】:

    • 顺便说一句好主意..我觉得它很漂亮。
    • 这是一个替代方案,但只有当你确定你的数字是有效的数字而不是字符时才优雅;)
    • thks akrun,这样真的太棒了!
    • 我的数据框是字符格式,然后我改为数字.. 所以它工作正常。非常感谢
    • 是的,需要这种隐式检查。这是选择序列之外的另一个标准,但非常整洁!很高兴为您提供帮助!
    【解决方案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 开始直到列的总数,并每两列返回一个列索引。在此,我只是根据需要添加了第一列和第二列。

    【讨论】:

    • 感谢您的 cmets。 U 代码给出了预期的结果,但抛出了以下警告; Warning in run(timeoutMs) : incomplete final line found by readTableHeader on 'clipboard'
    • 我复制了您的示例数据(将其保存在剪贴板中),然后使用read.table,第一个参数是“剪贴板”;即我基本上阅读了您的示例表。确保你也这样做,否则我不知道剪贴板中将存储什么:)
    猜你喜欢
    • 2020-03-22
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2019-12-20
    相关资源
    最近更新 更多