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

有没有办法让我根据从一个特定的string开始的列名称来分组数据? 我有一些像ABC_1 ABC_2 ABC_3和一些像XYZ_1, XYZ_2,XYZ_3这样的列。

我怎样才能基于包含上述部分的文本(可以说, ABCXYZ )的列我的df ? 我可以使用索引,但是这些列在数据上太分散,而且太多的硬编码。

此外,我只想包括每个这些列的行,其中任何一个值是>0所以如果上面的6列中的任何一个在行中有1 ,它会切入我的最终数据框。

试试你的data.frame的名字data.framegrepl将正则expression式匹配到目标,如果find匹配则返回TRUE ,否则返回FALSE 。 该函数是vector化的,所以你可以传递一个string的vector来匹配,你将得到一个返回的布尔值的向量。

 # 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 

为了回答第二部分,我将创build子集data.frame,然后创build一个向量索引行(像这样的一个逻辑向量)…

 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 

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

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

使用dplyr你可以:

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