有没有办法让我根据以特定字符串开头的列名来对数据进行子集化?我有一些列像 ABC_1 ABC_2 ABC_3 ,有些像 XYZ_1, XYZ_2,XYZ_3 让我们说 .
ABC_1 ABC_2 ABC_3
XYZ_1, XYZ_2,XYZ_3
如何仅基于包含上述文本部分的列(例如, ABC 或 XYZ )来对我的 df 进行子集化?我可以使用索引,但是数据中的列太分散,而且编码太多了 .
ABC
XYZ
df
另外,我想只包含来自这些列的每一行的行,其中任何值都是 >0 所以如果上面的 6 列中的任何一行在行中有 1 ,它会切入我的最终数据帧 .
>0
6
1
在 data.frame 的名称上尝试 grepl . grepl 将正则表达式与目标匹配,如果找到匹配则返回 TRUE ,否则返回 FALSE . 该函数是矢量化的,因此你可以传递一个字符串向量来匹配,你将得到一个返回的布尔值向量 .
data.frame
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
您也可以像这样使用 starts_with 和 dplyr 的 select() :
starts_with
dplyr
select()
df <- df %>% dplyr:: select(starts_with("ABC"))
使用dplyr你可以:
df <- df %>% dplyr:: select(grep("ABC", names(df)), grep("XYZ", names(df)))
这对我有用:
df[,names(df) %in% colnames(df)[grepl(str,colnames(df))]]
4 回答
在
data.frame
的名称上尝试grepl
.grepl
将正则表达式与目标匹配,如果找到匹配则返回TRUE
,否则返回FALSE
. 该函数是矢量化的,因此你可以传递一个字符串向量来匹配,你将得到一个返回的布尔值向量 .示例
为了回答第二部分,我将制作子集data.frame,然后制作一个索引行的向量以保持(逻辑向量),就像这样......
您也可以像这样使用
starts_with
和dplyr
的select()
:使用dplyr你可以:
这对我有用: