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

标签 r subset

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

如何仅根据包含上述文本部分的列(例如,ABCXYZ)对我的 df 进行子集化?我可以使用索引,但是列在数据中太分散,并且它变得太多的硬编码。

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

最佳答案

data.frame 的名称上尝试 greplgrepl 将正则表达式与目标进行匹配,如果找到匹配则返回 TRUE,否则返回 FALSE。该函数是矢量化的,因此您可以传递字符串向量进行匹配,并且您将获得返回的 bool 值向量。

示例

#  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

关于r - 数据子集仅包含名称与条件匹配的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18587334/

相关文章:

sql - 在 R 函数中调用 SQL 函数

R:按行内容划分数据框的子集列表?申请/申请

r - 大矩阵中的子集慢

按顺序省略最后一个元素

r - 如何解决r中的未知变量?

r - 矢量化 Rcpp 随机二项式绘制

r - 从每小时中提取/子集分钟值

r - 如何按R中一行中的值选择列

r - 计算R中所有列组合的类内系数

r - Dplyr:按条件过滤成对分组数据集,每对只保留一行