有没有办法根据以特定字符串开头的列名对数据进行子集划分?我有一些列,比如说ABC_1 ABC_2 ABC_3
和XYZ_1, XYZ_2,XYZ_3
.
如何仅基于包含上述文本部分(比如ABC
或XYZ
)的列来子集我的df
?我可以使用索引,但这些列在数据中过于分散,这就变成了太多的硬编码.
此外,我只想包含这些列中任何一列的值为>0
的行,因此如果上面6
列中的任何一列的行中有1
,那么它将剪切到我的最终数据帧中.
有没有办法根据以特定字符串开头的列名对数据进行子集划分?我有一些列,比如说ABC_1 ABC_2 ABC_3
和XYZ_1, XYZ_2,XYZ_3
.
如何仅基于包含上述文本部分(比如ABC
或XYZ
)的列来子集我的df
?我可以使用索引,但这些列在数据中过于分散,这就变成了太多的硬编码.
此外,我只想包含这些列中任何一列的值为>0
的行,因此如果上面6
列中的任何一列的行中有1
,那么它将剪切到我的最终数据帧中.
在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
为了回答第二部分,我将生成子集数据.帧,然后制作一个向量,对行进行索引,以保持(逻辑向量)如下...
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