70

有没有办法让我根据以特定字符串开头的列名来子集数据?我有一些类似的专栏ABC_1 ABC_2 ABC_3和一些类似的专栏XYZ_1, XYZ_2,XYZ_3

df如何仅根据包含上述文本部分的列(比如说,ABC或)对我的子集进行子集化XYZ?我可以使用索引,但是列在数据中太分散了,而且硬编码太多了。

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

4

8 回答 8

104

试试grepl你的名字data.framegrepl将正则表达式匹配到目标,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
于 2013-09-03T08:28:03.070 回答
37

你也可以像这样使用starts_withand :dplyrselect()

df <- df %>% dplyr:: select(starts_with("ABC"))
于 2017-02-28T12:52:05.953 回答
15

以防万一data.table用户,以下对我有用:

df[, grep("ABC", names(df)), with = FALSE]
于 2019-02-04T02:47:17.470 回答
13

使用 dplyr 你可以:

df <- df %>% dplyr:: select(grep("ABC", names(df)), grep("XYZ", names(df)))
于 2016-10-13T20:40:53.450 回答
3

这对我有用:

df[,names(df) %in% colnames(df)[grepl(str,colnames(df))]]
于 2018-03-01T15:51:55.703 回答
2

我的统计学教授给我的最简单的解决方案:

df[,grep("pattern", colnames(df))] 

而已。它不会为您提供布尔值或任何东西,它只会为您提供遵循该模式的数据集。

于 2021-03-23T20:54:28.023 回答
0

综上所述,我认为它是最灵活的。请注意,您需要使用 dplyr,但这并不是一件可怕的事情。

优点:可以搜索多个“ contains”。在这里,我使用“ starts_with”来表示一个比较常见的字符串“ST”。在这里使用“ grep”很容易让你发疯;疯了,我说!

library(dplyr)

df %>% dplyr::select(starts_with("ST",ignore.case = TRUE))
于 2021-09-26T21:10:20.577 回答
0

试试这个(在这里,寻找名称包含“日期”的变量,包括所有大小写组合):

df %>%  dplyr::select(contains("date",ignore.case = TRUE))
于 2021-05-11T21:01:28.803 回答