首页 文章

子集数据仅包含名称与条件匹配的列

提问于
浏览
35

有没有办法让我根据以特定字符串开头的列名来对数据进行子集化?我有一些列像 ABC_1 ABC_2 ABC_3 ,有些像 XYZ_1, XYZ_2,XYZ_3 让我们说 .

如何仅基于包含上述文本部分的列(例如, ABCXYZ )来对我的 df 进行子集化?我可以使用索引,但是数据中的列太分散,而且编码太多了 .

另外,我想只包含来自这些列的每一行的行,其中任何值都是 >0 所以如果上面的 6 列中的任何一行在行中有 1 ,它会切入我的最终数据帧 .

4 回答

  • 60

    data.frame 的名称上尝试 grepl . grepl 将正则表达式与目标匹配,如果找到匹配则返回 TRUE ,否则返回 FALSE . 该函数是矢量化的,因此你可以传递一个字符串向量来匹配,你将得到一个返回的布尔值向量 .

    示例

    #  Data
    df <- data.frame( ABC_1 = runif(3),
                ABC_2 = runif(3),
                XYZ_1 = runif(3),
                XYZ_2 = runif(3) )
    
    #      ABC_1     ABC_2     XYZ_1     XYZ_2
    #1 0.3792645 0.3614199 0.9793573 0.7139381
    #2 0.1313246 0.9746691 0.7276705 0.0126057
    #3 0.7282680 0.6518444 0.9531389 0.9673290
    
    #  Use grepl
    df[ , grepl( "ABC" , names( df ) ) ]
    #      ABC_1     ABC_2
    #1 0.3792645 0.3614199
    #2 0.1313246 0.9746691
    #3 0.7282680 0.6518444
    
    #  grepl returns logical vector like this which is what we use to subset columns
    grepl( "ABC" , names( df ) )
    #[1]  TRUE  TRUE FALSE FALSE
    

    为了回答第二部分,我将制作子集data.frame,然后制作一个索引行的向量以保持(逻辑向量),就像这样......

    set.seed(1)
    df <- data.frame( ABC_1 = sample(0:1,3,repl = TRUE),
                ABC_2 = sample(0:1,3,repl = TRUE),
                XYZ_1 = sample(0:1,3,repl = TRUE),
                XYZ_2 = sample(0:1,3,repl = TRUE) )
    
    # We will want to discard the second row because 'all' ABC values are 0:
    #  ABC_1 ABC_2 XYZ_1 XYZ_2
    #1     0     1     1     0
    #2     0     0     1     0
    #3     1     1     1     0
    
    
    df1 <- df[ , grepl( "ABC" , names( df ) ) ]
    
    ind <- apply( df1 , 1 , function(x) any( x > 0 ) )
    
    df1[ ind , ]
    #  ABC_1 ABC_2
    #1     0     1
    #3     1     1
    
  • 13

    您也可以像这样使用 starts_withdplyrselect()

    df <- df %>% dplyr:: select(starts_with("ABC"))
    
  • 5

    使用dplyr你可以:

    df <- df %>% dplyr:: select(grep("ABC", names(df)), grep("XYZ", names(df)))
    
  • 2

    这对我有用:

    df[,names(df) %in% colnames(df)[grepl(str,colnames(df))]]
    

相关问题