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

时间:2013-09-03 08:19:22

标签: r subset

我是否有办法根据以特定字符串开头的列名来对数据进行子集化?我有一些列类似于ABC_1 ABC_2 ABC_3,有些像XYZ_1, XYZ_2,XYZ_3这样的列。

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

此外,我希望只包含来自其中每个列的行,其中任何值为>0,因此如果上面的6列中的任何一列在行中有1,它缩小了我的最终数据框架。

7 个答案:

答案 0 :(得分:66)

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

答案 1 :(得分:17)

你也可以使用starts_withdplyr的{​​{1}},如下所示:

select()

答案 2 :(得分:5)

使用dplyr你可以:

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

答案 3 :(得分:2)

这对我有用:

Dim command As New MySqlCommand("SELECT `username`, `password` FROM `users` WHERE `username` = @username AND `password` = @password", connection)

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

仅对于data.table用户而言,以下内容对我有用:

df[, grep("ABC", names(df)), with = FALSE]

答案 6 :(得分:0)

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

df %>% dplyr::select(contains("date",ignore.case = TRUE))