有没有办法让我根据以特定字符串开头的列名来对数据进行子集化?我有一些相似的列,ABC_1 ABC_2 ABC_3有些像XYZ_1, XYZ_2,XYZ_3我们说的.
我如何df仅根据包含上述文本部分的列来设置我的基础(比方说,ABC或者XYZ)?我可以使用索引,但是数据中的列分散太多,而且编码太多了.
另外,我想只包含来自这些列的每一行的行,其中任何值都是>0如此,如果6上面的任一列1在行中有一个,它就会切入我的最终数据帧.
Sim*_*lon 73
试试grepl你的名字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
Run Code Online (Sandbox Code Playgroud)
为了回答第二部分,我将制作子集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
Run Code Online (Sandbox Code Playgroud)
小智 21
您也可以使用starts_with和dplyr的select(),像这样:
df <- df %>% dplyr:: select(starts_with("ABC"))
Run Code Online (Sandbox Code Playgroud)
小智 16
我的统计学教授给我的最简单的解决方案:
df[,grep("pattern", colnames(df))]
Run Code Online (Sandbox Code Playgroud)
就是这样。它不会为您提供布尔值或任何内容,它只是为您提供遵循该模式的数据集。
小智 7
使用dplyr你可以:
df <- df %>% dplyr:: select(grep("ABC", names(df)), grep("XYZ", names(df)))
Run Code Online (Sandbox Code Playgroud)
以防万一,对于data.table用户来说,以下内容适用于我:
df[, grep("ABC", names(df)), with = FALSE]
Run Code Online (Sandbox Code Playgroud)
这对我有用:
df[,names(df) %in% colnames(df)[grepl(str,colnames(df))]]
Run Code Online (Sandbox Code Playgroud)